function BigInteger ( e , t , n ) { null != e && ( "number" == typeof e ? this . fromNumber ( e , t , n ) : null == t && "string" != typeof e ? this . fromString ( e , 256 ) : this . fromString ( e , t ) ) } function nbi ( ) { return new BigInteger ( null ) } function am1 ( e , t , n , a , i , o ) { for ( ; -- o >= 0 ; ) { var s = t * this [ e ++ ] + n [ a ] + i ; i = Math . floor ( s / 67108864 ) , n [ a ++ ] = 67108863 & s } return i } function am2 ( e , t , n , a , i , o ) { for ( var s = 32767 & t , r = t >> 15 ; -- o >= 0 ; ) { var l = 32767 & this [ e ] , c = this [ e ++ ] >> 15 , d = r * l + c * s ; l = s * l + ( ( 32767 & d ) << 15 ) + n [ a ] + ( 1073741823 & i ) , i = ( l >>> 30 ) + ( d >>> 15 ) + r * c + ( i >>> 30 ) , n [ a ++ ] = 1073741823 & l } return i } function am3 ( e , t , n , a , i , o ) { for ( var s = 16383 & t , r = t >> 14 ; -- o >= 0 ; ) { var l = 16383 & this [ e ] , c = this [ e ++ ] >> 14 , d = r * l + c * s ; l = s * l + ( ( 16383 & d ) << 14 ) + n [ a ] + i , i = ( l >> 28 ) + ( d >> 14 ) + r * c , n [ a ++ ] = 268435455 & l } return i } function int2char ( e ) { return BI _RM . charAt ( e ) } function intAt ( e , t ) { var n = BI _RC [ e . charCodeAt ( t ) ] ; return null == n ? - 1 : n } function bnpCopyTo ( e ) { for ( var t = this . t - 1 ; t >= 0 ; -- t ) e [ t ] = this [ t ] ; e . t = this . t , e . s = this . s } function bnpFromInt ( e ) { this . t = 1 , this . s = e < 0 ? - 1 : 0 , e > 0 ? this [ 0 ] = e : e < - 1 ? this [ 0 ] = e + this . DV : this . t = 0 } function nbv ( e ) { var t = nbi ( ) ; return t . fromInt ( e ) , t } function bnpFromString ( e , t , n ) { var a ; if ( 16 == t ) a = 4 ; else if ( 8 == t ) a = 3 ; else if ( 256 == t ) a = 8 ; else if ( 2 == t ) a = 1 ; else if ( 32 == t ) a = 5 ; else { if ( 4 != t ) return void this . fromRadix ( e , t ) ; a = 2 } this . t = 0 , this . s = 0 ; for ( var i = e . length , o = ! 1 , s = 0 ; -- i >= 0 ; ) { var r = 8 == a ? 255 & e [ i ] : intAt ( e , i ) ; r < 0 ? "-" == e . charAt ( i ) && ( o = ! 0 ) : ( o = ! 1 , 0 == s ? this [ this . t ++ ] = r : s + a > this . DB ? ( this [ this . t - 1 ] |= ( r & ( 1 << this . DB - s ) - 1 ) << s , this [ this . t ++ ] = r >> this . DB - s ) : this [ this . t - 1 ] |= r << s , s += a , s >= this . DB && ( s -= this . DB ) ) } 8 == a && 0 != ( 128 & e [ 0 ] ) && n && ( this . s = - 1 , s > 0 && ( this [ this . t - 1 ] |= ( 1 << this . DB - s ) - 1 << s ) ) , this . clamp ( ) , o && BigInteger . ZERO . subTo ( this , this ) } function bnpClamp ( ) { for ( var e = this . s & this . DM ; this . t > 0 && this [ this . t - 1 ] == e ; ) -- this . t } function bnToString ( e ) { if ( this . s < 0 ) return "-" + this . negate ( ) . toString ( e ) ; var t ; if ( 16 == e ) t = 4 ; else if ( 8 == e ) t = 3 ; else if ( 2 == e ) t = 1 ; else if ( 32 == e ) t = 5 ; else { if ( 4 != e ) return this . toRadix ( e ) ; t = 2 } var n , a = ( 1 << t ) - 1 , i = ! 1 , o = "" , s = this . t , r = this . DB - s * this . DB % t ; if ( s -- > 0 ) for ( r < this . DB && ( n = this [ s ] >> r ) > 0 && ( i = ! 0 , o = int2char ( n ) ) ; s >= 0 ; ) r < t ? ( n = ( this [ s ] & ( 1 << r ) - 1 ) << t - r , n |= this [ -- s ] >> ( r += this . DB - t ) ) : ( n = this [ s ] >> ( r -= t ) & a , r <= 0 && ( r += this . DB , -- s ) ) , n > 0 && ( i = ! 0 ) , i && ( o += int2char ( n ) ) ; return i ? o : "0" } function bnNegate ( ) { var e = nbi ( ) ; return BigInteger . ZERO . subTo ( this , e ) , e } function bnAbs ( ) { return this . s < 0 ? this . negate ( ) : this } function bnCompareTo ( e ) { var t = this . s - e . s ; if ( 0 != t ) return t ; var n = this . t ; if ( t = n - e . t , 0 != t ) return this . s < 0 ? - t : t ; for ( ; -- n >= 0 ; ) if ( 0 != ( t = this [ n ] - e [ n ] ) ) return t ; return 0 } function nbits ( e ) { var t , n = 1 ; return 0 != ( t = e >>> 16 ) && ( e = t , n += 16 ) , 0 != ( t = e >> 8 ) && ( e = t , n += 8 ) , 0 != ( t = e >> 4 ) && ( e = t , n += 4 ) , 0 != ( t = e >> 2 ) && ( e = t , n += 2 ) , 0 != ( t = e >> 1 ) && ( e = t , n += 1 ) , n } function bnBitLength ( ) { return this . t <= 0 ? 0 : this . DB * ( this . t - 1 ) + nbits ( this [ this . t - 1 ] ^ this . s & this . DM ) } function bnpDLShiftTo ( e , t ) { var n ; for ( n = this . t - 1 ; n >= 0 ; -- n ) t [ n + e ] = this [ n ] ; for ( n = e - 1 ; n >= 0 ; -- n ) t [ n ] = 0 ; t . t = this . t + e , t . s = this . s } function bnpDRShiftTo ( e , t ) { for ( var n = e ; n < this . t ; ++ n ) t [ n - e ] = this [ n ] ; t . t = Math . max ( this . t - e , 0 ) , t . s = this . s } function bnpLShiftTo ( e , t ) { var n , a = e % this . DB , i = this . DB - a , o = ( 1 << i ) - 1 , s = Math . floor ( e / this . DB ) , r = this . s << a & this . DM ; for ( n = this . t - 1 ; n >= 0 ; -- n ) t [ n + s + 1 ] = this [ n ] >> i | r , r = ( this [ n ] & o ) << a ; for ( n = s - 1 ; n >= 0 ; -- n ) t [ n ] = 0 ; t [ s ] = r , t . t = this . t + s + 1 , t . s = this . s , t . clamp ( ) } function bnpRShiftTo ( e , t ) { t . s = this . s ; var n = Math . floor ( e / this . DB ) ; if ( n >= this . t ) return void ( t . t = 0 ) ; var a = e % this . DB , i = this . DB - a , o = ( 1 << a ) - 1 ; t [ 0 ] = this [ n ] >> a ; for ( var s = n + 1 ; s < this . t ; ++ s ) t [ s - n - 1 ] |= ( this [ s ] & o ) << i , t [ s - n ] = this [ s ] >> a ; a > 0 && ( t [ this . t - n - 1 ] |= ( this . s & o ) << i ) , t . t = this . t - n , t . clamp ( ) } function bnpSubTo ( e , t ) { for ( var n = 0 , a = 0 , i = Math . min ( e . t , this . t ) ; n < i ; ) a += this [ n ] - e [ n ] , t [ n ++ ] = a & this . DM , a >>= this . DB ; if ( e . t < this . t ) { for ( a -= e . s ; n < this . t ; ) a += this [ n ] , t [ n ++ ] = a & this . DM , a >>= this . DB ; a += this . s } else { for ( a += this . s ; n < e . t ; ) a -= e [ n ] , t [ n ++ ] = a & this . DM , a >>= this . DB ; a -= e . s } t . s = a < 0 ? - 1 : 0 , a < - 1 ? t [ n ++ ] = this . DV + a : a > 0 && ( t [ n ++ ] = a ) , t . t = n , t . clamp ( ) } function bnpMultiplyTo ( e , t ) { var n = this . abs ( ) , a = e . abs ( ) , i = n . t ; for ( t . t = i + a . t ; -- i >= 0 ; ) t [ i ] = 0 ; for ( i = 0 ; i < a . t ; ++ i ) t [ i + n . t ] = n . am ( 0 , a [ i ] , t , i , 0 , n . t ) ; t . s = 0 , t . clamp ( ) , this . s != e . s && BigInteger . ZERO . subTo ( t , t ) } function bnpSquareTo ( e ) { for ( var t = this . abs ( ) , n = e . t = 2 * t . t ; -- n >= 0 ; ) e [ n ] = 0 ; for ( n = 0 ; n < t . t - 1 ; ++ n ) { var a = t .
return ! 1 } function cancelEvent ( e ) { return e = e || window . event , e && ( e = e . originalEvent || e , e . stopPropagation && e . stopPropagation ( ) , e . preventDefault && e . preventDefault ( ) , e . returnValue = ! 1 , e . cancelBubble = ! 0 ) , ! 1 } function hasOnlick ( e ) { if ( e . onclick || e . getAttribute ( "ng-click" ) ) return ! 0 ; var t = $ . _data ( e , "events" ) ; return ! ( ! t || ! t . click && ! t . mousedown ) } function getScrollWidth ( ) { var e = $ ( "<div>" ) . css ( { position : "absolute" , width : 100 , height : 100 , overflow : "scroll" , top : - 9999 } ) . appendTo ( $ ( document . body ) ) , t = e [ 0 ] . offsetWidth - e [ 0 ] . clientWidth ; return e . remove ( ) , t } function onCtrlEnter ( e , t ) { $ ( e ) . on ( "keydown" , function ( e ) { if ( 13 == e . keyCode && ( e . ctrlKey || e . metaKey ) ) return t ( ) , cancelEvent ( e ) } ) } function setFieldSelection ( e , t , n ) { e = $ ( e ) [ 0 ] ; try { if ( e . focus ( ) , void 0 !== t && t !== ! 1 || ( t = e . value . length ) , void 0 !== n && n !== ! 1 || ( n = t ) , e . createTextRange ) { var a = e . createTextRange ( ) ; a . collapse ( ! 0 ) , a . moveEnd ( "character" , n ) , a . moveStart ( "character" , t ) , a . select ( ) } else e . setSelectionRange && e . setSelectionRange ( t , n ) } catch ( i ) { } } function getFieldSelection ( e ) { if ( e . selectionStart ) return e . selectionStart ; if ( ! document . selection ) return 0 ; var t = " " , n = document . selection . createRange ( ) , a = n . text , i = n . duplicate ( ) , o = 0 ; try { i . moveToElementText ( e ) } catch ( s ) { return 0 } return n . text = a + t , o = i . text . indexOf ( t ) , n . moveStart ( "character" , - 1 ) , n . text = "" , o } function getRichValue ( e ) { if ( ! e ) return "" ; var t = [ ] , n = [ ] ; getRichElementValue ( e , t , n ) , n . length && t . push ( n . join ( "" ) ) ; var a = t . join ( "\n" ) ; return a = a . replace ( /\u00A0/g , " " ) } function getRichValueWithCaret ( e ) { if ( ! e ) return [ ] ; var t , n , a = [ ] , i = [ ] , o = ! ! window . getSelection && window . getSelection ( ) ; if ( o && o . rangeCount ) { var s = o . getRangeAt ( 0 ) ; s . startContainer && s . startContainer == s . endContainer && s . startOffset == s . endOffset && ( t = s . startContainer , n = s . startOffset ) } getRichElementValue ( e , a , i , t , n ) , i . length && a . push ( i . join ( "" ) ) ; var r = a . join ( "\n" ) , l = r . indexOf ( " " ) ; return l != - 1 && ( r = r . substr ( 0 , l ) + r . substr ( l + 1 ) ) , r = r . replace ( /\u00A0/g , " " ) , [ r , l ] } function getRichElementValue ( e , t , n , a , i ) { if ( 3 != e . nodeType ) { if ( 1 == e . nodeType ) { var o , s = a === e , r = "DIV" == e . tagName || "P" == e . tagName ; r && n . length || "BR" == e . tagName ? ( t . push ( n . join ( "" ) ) , n . splice ( 0 , n . length ) ) : "IMG" == e . tagName && e . alt && n . push ( e . alt ) , s && ! i && n . push ( " " ) ; for ( var o = e . firstChild ; o ; ) getRichElementValue ( o , t , n , a , i ) , o = o . nextSibling ; s && i && n . push ( " " ) , r && n . length && ( t . push ( n . join ( "" ) ) , n . splice ( 0 , n . length ) ) } } else if ( a === e ) { var l = e . nodeValue ; n . push ( l . substr ( 0 , i ) + " " + l . substr ( i ) ) } else n . push ( e . nodeValue ) } function setRichFocus ( e , t , n ) { if ( e . focus ( ) , ! t || t . parentNode != e || t . nextSibling || n || ( e . removeChild ( t ) , t = null ) , window . getSelection && document . createRange ) { var a = document . createRange ( ) ; t ? a . selectNode ( t ) : a . selectNodeContents ( e ) , n || a . collapse ( ! 1 ) ; var i = window . getSelection ( ) ; i . removeAllRanges ( ) , i . addRange ( a ) } else if ( void 0 !== document . body . createTextRange ) { var o = document . body . createTextRange ( ) ; o . moveToElementText ( t || e ) , n || o . collapse ( ! 1 ) , o . select ( ) } } function getSelectedText ( ) { var e = ( window . getSelection && window . getSelection ( ) || document . getSelection && document . getSelection ( ) || document . selection && document . selection . createRange ( ) . text || "" ) . toString ( ) . replace ( /^\s+|\s+$/g , "" ) ; return e } function scrollToNode ( e , t , n ) { var a = t . offsetTop - 15 , i = t . offsetHeight + 30 , o = e . scrollTop , s = e . clientHeight ; o > a ? ( e . scrollTop = a , $ ( n ) . nanoScroller ( { flash : ! 0 } ) ) : o < a + i - s && ( e . scrollTop = a + i - s , $ ( n ) . nanoScroller ( { flash : ! 0 } ) ) } function onContentLoaded ( e ) { e = onAnimationFrameCallback ( e ) , setZeroTimeout ( e ) } function tsNow ( e ) { var t = + new Date + ( window . tsOffset || 0 ) ; return e ? Math . floor ( t / 1e3 ) : t } function safeReplaceObject ( e , t ) { for ( var n in e ) t . hasOwnProperty ( n ) || "$" == n . charAt ( 0 ) || delete e [ n ] ; for ( var n in t ) t . hasOwnProperty ( n ) && ( e [ n ] = t [ n ] ) } function listMergeSorted ( e , t ) { e = e || [ ] , t = t || [ ] ; for ( var n = angular . copy ( e ) , a = e . length ? e [ e . length - 1 ] : 4294967295 , i = 0 ; i < t . length ; i ++ ) t [ i ] < a && n . push ( t [ i ] ) ; return n } function listUniqSorted ( e ) { e = e || [ ] ; for ( var t = [ ] , n = ! 1 , a = 0 ; a < e . length ; a ++ ) e [ a ] !== n && t . push ( e [ a ] ) , n = e [ a ] ; return t } function templateUrl ( e ) { var t = { confirm _modal : "desktop" , error _modal : "desktop" , media _modal _layout : "desktop" , slider : "desktop" , reply _message : "desktop" , message _body : "desktop" , message _media : "desktop" , forwarded _messages : "desktop" , chat _invite _link _modal : " deskto
a !== r && i . push ( e [ o ] ) ; return i } , map : function ( e , t , a ) { var i , o = 0 , s = e . length , r = n ( e ) , l = [ ] ; if ( r ) for ( ; s > o ; o ++ ) i = t ( e [ o ] , o , a ) , null != i && l . push ( i ) ; else for ( o in e ) i = t ( e [ o ] , o , a ) , null != i && l . push ( i ) ; return Z . apply ( [ ] , l ) } , guid : 1 , proxy : function ( e , t ) { var n , a , i ; return "string" == typeof t && ( i = e [ t ] , t = e , e = i ) , ie . isFunction ( e ) ? ( n = Y . call ( arguments , 2 ) , a = function ( ) { return e . apply ( t || this , n . concat ( Y . call ( arguments ) ) ) } , a . guid = e . guid = e . guid || ie . guid ++ , a ) : void 0 } , now : function ( ) { return + new Date } , support : ne } ) , ie . each ( "Boolean Number String Function Array Date RegExp Object Error" . split ( " " ) , function ( e , t ) { Q [ "[object " + t + "]" ] = t . toLowerCase ( ) } ) ; var ce = function ( e ) { function t ( e , t , n , a ) { var i , o , s , r , l , c , u , m , g , h ; if ( ( t ? t . ownerDocument || t : B ) !== D && T ( t ) , t = t || D , n = n || [ ] , ! e || "string" != typeof e ) return n ; if ( 1 !== ( r = t . nodeType ) && 9 !== r ) return [ ] ; if ( F && ! a ) { if ( i = ve . exec ( e ) ) if ( s = i [ 1 ] ) { if ( 9 === r ) { if ( o = t . getElementById ( s ) , ! o || ! o . parentNode ) return n ; if ( o . id === s ) return n . push ( o ) , n } else if ( t . ownerDocument && ( o = t . ownerDocument . getElementById ( s ) ) && U ( t , o ) && o . id === s ) return n . push ( o ) , n } else { if ( i [ 2 ] ) return Q . apply ( n , t . getElementsByTagName ( e ) ) , n ; if ( ( s = i [ 3 ] ) && w . getElementsByClassName && t . getElementsByClassName ) return Q . apply ( n , t . getElementsByClassName ( s ) ) , n } if ( w . qsa && ( ! N || ! N . test ( e ) ) ) { if ( m = u = L , g = t , h = 9 === r && e , 1 === r && "object" !== t . nodeName . toLowerCase ( ) ) { for ( c = S ( e ) , ( u = t . getAttribute ( "id" ) ) ? m = u . replace ( be , "\\$&" ) : t . setAttribute ( "id" , m ) , m = "[id='" + m + "'] " , l = c . length ; l -- ; ) c [ l ] = m + p ( c [ l ] ) ; g = ye . test ( e ) && d ( t . parentNode ) || t , h = c . join ( "," ) } if ( h ) try { return Q . apply ( n , g . querySelectorAll ( h ) ) , n } catch ( f ) { } finally { u || t . removeAttribute ( "id" ) } } } return x ( e . replace ( le , "$1" ) , t , n , a ) } function n ( ) { function e ( n , a ) { return t . push ( n + " " ) > k . cacheLength && delete e [ t . shift ( ) ] , e [ n + " " ] = a } var t = [ ] ; return e } function a ( e ) { return e [ L ] = ! 0 , e } function i ( e ) { var t = D . createElement ( "div" ) ; try { return ! ! e ( t ) } catch ( n ) { return ! 1 } finally { t . parentNode && t . parentNode . removeChild ( t ) , t = null } } function o ( e , t ) { for ( var n = e . split ( "|" ) , a = e . length ; a -- ; ) k . attrHandle [ n [ a ] ] = t } function s ( e , t ) { var n = t && e , a = n && 1 === e . nodeType && 1 === t . nodeType && ( ~ t . sourceIndex || K ) - ( ~ e . sourceIndex || K ) ; if ( a ) return a ; if ( n ) for ( ; n = n . nextSibling ; ) if ( n === t ) return - 1 ; return e ? 1 : - 1 } function r ( e ) { return function ( t ) { var n = t . nodeName . toLowerCase ( ) ; return "input" === n && t . type === e } } function l ( e ) { return function ( t ) { var n = t . nodeName . toLowerCase ( ) ; return ( "input" === n || "button" === n ) && t . type === e } } function c ( e ) { return a ( function ( t ) { return t = + t , a ( function ( n , a ) { for ( var i , o = e ( [ ] , n . length , t ) , s = o . length ; s -- ; ) n [ i = o [ s ] ] && ( n [ i ] = ! ( a [ i ] = n [ i ] ) ) } ) } ) } function d ( e ) { return e && typeof e . getElementsByTagName !== G && e } function u ( ) { } function p ( e ) { for ( var t = 0 , n = e . length , a = "" ; n > t ; t ++ ) a += e [ t ] . value ; return a } function m ( e , t , n ) { var a = t . dir , i = n && "parentNode" === a , o = H ++ ; return t . first ? function ( t , n , o ) { for ( ; t = t [ a ] ; ) if ( 1 === t . nodeType || i ) return e ( t , n , o ) } : function ( t , n , s ) { var r , l , c = [ j , o ] ; if ( s ) { for ( ; t = t [ a ] ; ) if ( ( 1 === t . nodeType || i ) && e ( t , n , s ) ) return ! 0 } else for ( ; t = t [ a ] ; ) if ( 1 === t . nodeType || i ) { if ( l = t [ L ] || ( t [ L ] = { } ) , ( r = l [ a ] ) && r [ 0 ] === j && r [ 1 ] === o ) return c [ 2 ] = r [ 2 ] ; if ( l [ a ] = c , c [ 2 ] = e ( t , n , s ) ) return ! 0 } } } function g ( e ) { return e . length > 1 ? function ( t , n , a ) { for ( var i = e . length ; i -- ; ) if ( ! e [ i ] ( t , n , a ) ) return ! 1 ; return ! 0 } : e [ 0 ] } function h ( e , n , a ) { for ( var i = 0 , o = n . length ; o > i ; i ++ ) t ( e , n [ i ] , a ) ; return a } function f ( e , t , n , a , i ) { for ( var o , s = [ ] , r = 0 , l = e . length , c = null != t ; l > r ; r ++ ) ( o = e [ r ] ) && ( ! n || n ( o , a , i ) ) && ( s . push ( o ) , c && t . push ( r ) ) ; return s } function _ ( e , t , n , i , o , s ) { return i && ! i [ L ] && ( i = _ ( i ) ) , o && ! o [ L ] && ( o = _ ( o , s ) ) , a ( function ( a , s , r , l ) { var c , d , u , p = [ ] , m = [ ] , g = s . length , _ = a || h ( t || "*" , r . nodeType ? [ r ] : r , [ ] ) , v = ! e || ! a && t ? _ : f ( _ , p , e , r , l ) , y = n ? o || ( a ? e : g || i ) ? [ ] : s : v ; if ( n && n ( v , y , r , l ) , i ) for ( c = f ( y , m ) , i ( c , [ ] , r , l ) , d = c . length ; d -- ; ) ( u = c [ d ] ) && ( y [ m [ d ] ] = ! ( v [ m [ d ] ] = u ) ) ; if ( a ) { if ( o || e ) { if ( o ) { for ( c = [ ] , d = y . length ; d -- ; ) ( u = y [ d ] ) && c . push ( v [ d ] = u ) ; o ( null , y = [ ] , c , l ) } for ( d = y . length ; d -- ; ) ( u = y [ d ] ) && ( c = o ? te . call ( a , u ) : p [ d ] ) > - 1 && ( a [ c ] = ! ( s [ c ] = u ) ) } } else y = f ( y === s ? y . splice ( g , y . length ) : y ) , o ? o ( null , s , y , l ) : Q . apply ( s , y ) } ) } function v ( e ) { for ( var t , n , a , i = e . length , o = k . relative [ e [ 0 ] . type ] , s = o || k . relative [ " " ] , r = o ? 1 : 0 , l = m ( function ( e ) { return e === t } , s , ! 0 ) , c = m ( function ( e ) { return te . call ( t , e ) > - 1 } , s , ! 0 ) , d = [ function ( e , n , a ) { return ! o && ( a || n !== I ) || ( ( t = n ) . nodeType ? l (
c . add && ( c . add . call ( e , u ) , u . handler . guid || ( u . handler . guid = n . guid ) ) , i ? p . splice ( p . delegateCount ++ , 0 , u ) : p . push ( u ) , ie . event . global [ m ] = ! 0 ) ; e = null } } , remove : function ( e , t , n , a , i ) { var o , s , r , l , c , d , u , p , m , g , h , f = ie . hasData ( e ) && ie . _data ( e ) ; if ( f && ( d = f . events ) ) { for ( t = ( t || "" ) . match ( ye ) || [ "" ] , c = t . length ; c -- ; ) if ( r = Ne . exec ( t [ c ] ) || [ ] , m = h = r [ 1 ] , g = ( r [ 2 ] || "" ) . split ( "." ) . sort ( ) , m ) { for ( u = ie . event . special [ m ] || { } , m = ( a ? u . delegateType : u . bindType ) || m , p = d [ m ] || [ ] , r = r [ 2 ] && new RegExp ( "(^|\\.)" + g . join ( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) , l = o = p . length ; o -- ; ) s = p [ o ] , ! i && h !== s . origType || n && n . guid !== s . guid || r && ! r . test ( s . namespace ) || a && a !== s . selector && ( "**" !== a || ! s . selector ) || ( p . splice ( o , 1 ) , s . selector && p . delegateCount -- , u . remove && u . remove . call ( e , s ) ) ; l && ! p . length && ( u . teardown && u . teardown . call ( e , g , f . handle ) !== ! 1 || ie . removeEvent ( e , m , f . handle ) , delete d [ m ] ) } else for ( m in d ) ie . event . remove ( e , m + t [ c ] , n , a , ! 0 ) ; ie . isEmptyObject ( d ) && ( delete f . handle , ie . _removeData ( e , "events" ) ) } } , trigger : function ( t , n , a , i ) { var o , s , r , l , c , d , u , p = [ a || ge ] , m = te . call ( t , "type" ) ? t . type : t , g = te . call ( t , "namespace" ) ? t . namespace . split ( "." ) : [ ] ; if ( r = d = a = a || ge , 3 !== a . nodeType && 8 !== a . nodeType && ! Fe . test ( m + ie . event . triggered ) && ( m . indexOf ( "." ) >= 0 && ( g = m . split ( "." ) , m = g . shift ( ) , g . sort ( ) ) , s = m . indexOf ( ":" ) < 0 && "on" + m , t = t [ ie . expando ] ? t : new ie . Event ( m , "object" == typeof t && t ) , t . isTrigger = i ? 2 : 3 , t . namespace = g . join ( "." ) , t . namespace _re = t . namespace ? new RegExp ( "(^|\\.)" + g . join ( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : null , t . result = void 0 , t . target || ( t . target = a ) , n = null == n ? [ t ] : ie . makeArray ( n , [ t ] ) , c = ie . event . special [ m ] || { } , i || ! c . trigger || c . trigger . apply ( a , n ) !== ! 1 ) ) { if ( ! i && ! c . noBubble && ! ie . isWindow ( a ) ) { for ( l = c . delegateType || m , Fe . test ( l + m ) || ( r = r . parentNode ) ; r ; r = r . parentNode ) p . push ( r ) , d = r ; d === ( a . ownerDocument || ge ) && p . push ( d . defaultView || d . parentWindow || e ) } for ( u = 0 ; ( r = p [ u ++ ] ) && ! t . isPropagationStopped ( ) ; ) t . type = u > 1 ? l : c . bindType || m , o = ( ie . _data ( r , "events" ) || { } ) [ t . type ] && ie . _data ( r , "handle" ) , o && o . apply ( r , n ) , o = s && r [ s ] , o && o . apply && ie . acceptData ( r ) && ( t . result = o . apply ( r , n ) , t . result === ! 1 && t . preventDefault ( ) ) ; if ( t . type = m , ! i && ! t . isDefaultPrevented ( ) && ( ! c . _default || c . _default . apply ( p . pop ( ) , n ) === ! 1 ) && ie . acceptData ( a ) && s && a [ m ] && ! ie . isWindow ( a ) ) { d = a [ s ] , d && ( a [ s ] = null ) , ie . event . triggered = m ; try { a [ m ] ( ) } catch ( h ) { } ie . event . triggered = void 0 , d && ( a [ s ] = d ) } return t . result } } , dispatch : function ( e ) { e = ie . event . fix ( e ) ; var t , n , a , i , o , s = [ ] , r = Y . call ( arguments ) , l = ( ie . _data ( this , "events" ) || { } ) [ e . type ] || [ ] , c = ie . event . special [ e . type ] || { } ; if ( r [ 0 ] = e , e . delegateTarget = this , ! c . preDispatch || c . preDispatch . call ( this , e ) !== ! 1 ) { for ( s = ie . event . handlers . call ( this , e , l ) , t = 0 ; ( i = s [ t ++ ] ) && ! e . isPropagationStopped ( ) ; ) for ( e . currentTarget = i . elem , o = 0 ; ( a = i . handlers [ o ++ ] ) && ! e . isImmediatePropagationStopped ( ) ; ) ( ! e . namespace _re || e . namespace _re . test ( a . namespace ) ) && ( e . handleObj = a , e . data = a . data , n = ( ( ie . event . special [ a . origType ] || { } ) . handle || a . handler ) . apply ( i . elem , r ) , void 0 !== n && ( e . result = n ) === ! 1 && ( e . preventDefault ( ) , e . stopPropagation ( ) ) ) ; return c . postDispatch && c . postDispatch . call ( this , e ) , e . result } } , handlers : function ( e , t ) { var n , a , i , o , s = [ ] , r = t . delegateCount , l = e . target ; if ( r && l . nodeType && ( ! e . button || "click" !== e . type ) ) for ( ; l != this ; l = l . parentNode || this ) if ( 1 === l . nodeType && ( l . disabled !== ! 0 || "click" !== e . type ) ) { for ( i = [ ] , o = 0 ; r > o ; o ++ ) a = t [ o ] , n = a . selector + " " , void 0 === i [ n ] && ( i [ n ] = a . needsContext ? ie ( n , this ) . index ( l ) >= 0 : ie . find ( n , this , null , [ l ] ) . length ) , i [ n ] && i . push ( a ) ; i . length && s . push ( { elem : l , handlers : i } ) } return r < t . length && s . push ( { elem : this , handlers : t . slice ( r ) } ) , s } , fix : function ( e ) { if ( e [ ie . expando ] ) return e ; var t , n , a , i = e . type , o = e , s = this . fixHooks [ i ] ; for ( s || ( this . fixHooks [ i ] = s = Pe . test ( i ) ? this . mouseHooks : De . test ( i ) ? this . keyHooks : { } ) , a = s . props ? this . props . concat ( s . props ) : this . props , e = new ie . Event ( o ) , t = a . length ; t -- ; ) n = a [ t ] , e [ n ] = o [ n ] ; return e . target || ( e . target = o . srcElement || ge ) , 3 === e . target . nodeType && ( e . target = e . target . parentNode ) , e . metaKey = ! ! e . metaKey , s . filter ? s . filter ( e , o ) : e } , props : "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which" . split ( " " ) , fixHooks : { } , keyHooks : { props : "char charCode key keyCode" . split ( " " ) , filter : function ( e , t ) { return null == e . which && ( e . which = null != t . charCode ? t . charCode :
prop : function ( e , t ) { return Ae ( this , ie . prop , e , t , arguments . length > 1 ) } , removeProp : function ( e ) { return e = ie . propFix [ e ] || e , this . each ( function ( ) { try { this [ e ] = void 0 , delete this [ e ] } catch ( t ) { } } ) } } ) , ie . extend ( { propFix : { "for" : "htmlFor" , "class" : "className" } , prop : function ( e , t , n ) { var a , i , o , s = e . nodeType ; if ( e && 3 !== s && 8 !== s && 2 !== s ) return o = 1 !== s || ! ie . isXMLDoc ( e ) , o && ( t = ie . propFix [ t ] || t , i = ie . propHooks [ t ] ) , void 0 !== n ? i && "set" in i && void 0 !== ( a = i . set ( e , n , t ) ) ? a : e [ t ] = n : i && "get" in i && null !== ( a = i . get ( e , t ) ) ? a : e [ t ] } , propHooks : { tabIndex : { get : function ( e ) { var t = ie . find . attr ( e , "tabindex" ) ; return t ? parseInt ( t , 10 ) : xt . test ( e . nodeName ) || It . test ( e . nodeName ) && e . href ? 0 : - 1 } } } } ) , ne . hrefNormalized || ie . each ( [ "href" , "src" ] , function ( e , t ) { ie . propHooks [ t ] = { get : function ( e ) { return e . getAttribute ( t , 4 ) } } } ) , ne . optSelected || ( ie . propHooks . selected = { get : function ( e ) { var t = e . parentNode ; return t && ( t . selectedIndex , t . parentNode && t . parentNode . selectedIndex ) , null } } ) , ie . each ( [ "tabIndex" , "readOnly" , "maxLength" , "cellSpacing" , "cellPadding" , "rowSpan" , "colSpan" , "useMap" , "frameBorder" , "contentEditable" ] , function ( ) { ie . propFix [ this . toLowerCase ( ) ] = this } ) , ne . enctype || ( ie . propFix . enctype = "encoding" ) ; var At = /[\t\r\n\f]/g ; ie . fn . extend ( { addClass : function ( e ) { var t , n , a , i , o , s , r = 0 , l = this . length , c = "string" == typeof e && e ; if ( ie . isFunction ( e ) ) return this . each ( function ( t ) { ie ( this ) . addClass ( e . call ( this , t , this . className ) ) } ) ; if ( c ) for ( t = ( e || "" ) . match ( ye ) || [ ] ; l > r ; r ++ ) if ( n = this [ r ] , a = 1 === n . nodeType && ( n . className ? ( " " + n . className + " " ) . replace ( At , " " ) : " " ) ) { for ( o = 0 ; i = t [ o ++ ] ; ) a . indexOf ( " " + i + " " ) < 0 && ( a += i + " " ) ; s = ie . trim ( a ) , n . className !== s && ( n . className = s ) } return this } , removeClass : function ( e ) { var t , n , a , i , o , s , r = 0 , l = this . length , c = 0 === arguments . length || "string" == typeof e && e ; if ( ie . isFunction ( e ) ) return this . each ( function ( t ) { ie ( this ) . removeClass ( e . call ( this , t , this . className ) ) } ) ; if ( c ) for ( t = ( e || "" ) . match ( ye ) || [ ] ; l > r ; r ++ ) if ( n = this [ r ] , a = 1 === n . nodeType && ( n . className ? ( " " + n . className + " " ) . replace ( At , " " ) : "" ) ) { for ( o = 0 ; i = t [ o ++ ] ; ) for ( ; a . indexOf ( " " + i + " " ) >= 0 ; ) a = a . replace ( " " + i + " " , " " ) ; s = e ? ie . trim ( a ) : "" , n . className !== s && ( n . className = s ) } return this } , toggleClass : function ( e , t ) { var n = typeof e ; return "boolean" == typeof t && "string" === n ? t ? this . addClass ( e ) : this . removeClass ( e ) : this . each ( ie . isFunction ( e ) ? function ( n ) { ie ( this ) . toggleClass ( e . call ( this , n , this . className , t ) , t ) } : function ( ) { if ( "string" === n ) for ( var t , a = 0 , i = ie ( this ) , o = e . match ( ye ) || [ ] ; t = o [ a ++ ] ; ) i . hasClass ( t ) ? i . removeClass ( t ) : i . addClass ( t ) ; else ( n === $e || "boolean" === n ) && ( this . className && ie . _data ( this , "__className__" , this . className ) , this . className = this . className || e === ! 1 ? "" : ie . _data ( this , "__className__" ) || "" ) } ) } , hasClass : function ( e ) { for ( var t = " " + e + " " , n = 0 , a = this . length ; a > n ; n ++ ) if ( 1 === this [ n ] . nodeType && ( " " + this [ n ] . className + " " ) . replace ( At , " " ) . indexOf ( t ) >= 0 ) return ! 0 ; return ! 1 } } ) , ie . each ( "blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu" . split ( " " ) , function ( e , t ) { ie . fn [ t ] = function ( e , n ) { return arguments . length > 0 ? this . on ( t , null , e , n ) : this . trigger ( t ) } } ) , ie . fn . extend ( { hover : function ( e , t ) { return this . mouseenter ( e ) . mouseleave ( t || e ) } , bind : function ( e , t , n ) { return this . on ( e , null , t , n ) } , unbind : function ( e , t ) { return this . off ( e , null , t ) } , delegate : function ( e , t , n , a ) { return this . on ( t , e , n , a ) } , undelegate : function ( e , t , n ) { return 1 === arguments . length ? this . off ( e , "**" ) : this . off ( t , e || "**" , n ) } } ) ; var Et = ie . now ( ) , Tt = /\?/ , Dt = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g ; ie . parseJSON = function ( t ) { if ( e . JSON && e . JSON . parse ) return e . JSON . parse ( t + "" ) ; var n , a = null , i = ie . trim ( t + "" ) ; return i && ! ie . trim ( i . replace ( Dt , function ( e , t , i , o ) { return n && t && ( a = 0 ) , 0 === a ? e : ( n = i || t , a += ! o - ! i , "" ) } ) ) ? Function ( "return " + i ) ( ) : ie . error ( "Invalid JSON: " + t ) } , ie . parseXML = function ( t ) { var n , a ; if ( ! t || "string" != typeof t ) return null ; try { e . DOMParser ? ( a = new DOMParser , n = a . parseFromString ( t , "text/xml" ) ) : ( n = new ActiveXObject ( "Microsoft.XMLDOM" ) , n . async = "false" , n . loadXML ( t ) ) } catch ( i ) { n = void 0 } return n && n . documentElement && ! n . getElementsByTag
Config . Schema . API = { constructors : [ { id : "-1132882121" , predicate : "boolFalse" , params : [ ] , type : "Bool" } , { id : "-1720552011" , predicate : "boolTrue" , params : [ ] , type : "Bool" } , { id : "1072550713" , predicate : "true" , params : [ ] , type : "True" } , { id : "481674261" , predicate : "vector" , params : [ ] , type : "Vector t" } , { id : "-994444869" , predicate : "error" , params : [ { name : "code" , type : "int" } , { name : "text" , type : "string" } ] , type : "Error" } , { id : "1450380236" , predicate : "null" , params : [ ] , type : "Null" } , { id : "2134579434" , predicate : "inputPeerEmpty" , params : [ ] , type : "InputPeer" } , { id : "2107670217" , predicate : "inputPeerSelf" , params : [ ] , type : "InputPeer" } , { id : "396093539" , predicate : "inputPeerChat" , params : [ { name : "chat_id" , type : "int" } ] , type : "InputPeer" } , { id : "-1182234929" , predicate : "inputUserEmpty" , params : [ ] , type : "InputUser" } , { id : "-138301121" , predicate : "inputUserSelf" , params : [ ] , type : "InputUser" } , { id : "-208488460" , predicate : "inputPhoneContact" , params : [ { name : "client_id" , type : "long" } , { name : "phone" , type : "string" } , { name : "first_name" , type : "string" } , { name : "last_name" , type : "string" } ] , type : "InputContact" } , { id : "-181407105" , predicate : "inputFile" , params : [ { name : "id" , type : "long" } , { name : "parts" , type : "int" } , { name : "name" , type : "string" } , { name : "md5_checksum" , type : "string" } ] , type : "InputFile" } , { id : "-1771768449" , predicate : "inputMediaEmpty" , params : [ ] , type : "InputMedia" } , { id : "-139464256" , predicate : "inputMediaUploadedPhoto" , params : [ { name : "file" , type : "InputFile" } , { name : "caption" , type : "string" } ] , type : "InputMedia" } , { id : "-373312269" , predicate : "inputMediaPhoto" , params : [ { name : "id" , type : "InputPhoto" } , { name : "caption" , type : "string" } ] , type : "InputMedia" } , { id : "-104578748" , predicate : "inputMediaGeoPoint" , params : [ { name : "geo_point" , type : "InputGeoPoint" } ] , type : "InputMedia" } , { id : "-1494984313" , predicate : "inputMediaContact" , params : [ { name : "phone_number" , type : "string" } , { name : "first_name" , type : "string" } , { name : "last_name" , type : "string" } ] , type : "InputMedia" } , { id : "480546647" , predicate : "inputChatPhotoEmpty" , params : [ ] , type : "InputChatPhoto" } , { id : "-1809496270" , predicate : "inputChatUploadedPhoto" , params : [ { name : "file" , type : "InputFile" } , { name : "crop" , type : "InputPhotoCrop" } ] , type : "InputChatPhoto" } , { id : "-1293828344" , predicate : "inputChatPhoto" , params : [ { name : "id" , type : "InputPhoto" } , { name : "crop" , type : "InputPhotoCrop" } ] , type : "InputChatPhoto" } , { id : "-457104426" , predicate : "inputGeoPointEmpty" , params : [ ] , type : "InputGeoPoint" } , { id : "-206066487" , predicate : "inputGeoPoint" , params : [ { name : "lat" , type : "double" } , { name : "long" , type : "double" } ] , type : "InputGeoPoint" } , { id : "483901197" , predicate : "inputPhotoEmpty" , params : [ ] , type : "InputPhoto" } , { id : "-74070332" , predicate : "inputPhoto" , params : [ { name : "id" , type : "long" } , { name : "access_hash" , type : "long" } ] , type : "InputPhoto" } , { id : "342061462" , predicate : "inputFileLocation" , params : [ { name : "volume_id" , type : "long" } , { name : "local_id" , type : "int" } , { name : "secret" , type : "long" } ] , type : "InputFileLocation" } , { id : "-1377390588" , predicate : "inputPhotoCropAuto" , params : [ ] , type : "InputPhotoCrop" } , { id : "-644787419" , predicate : "inputPhotoCrop" , params : [ { name : "crop_left" , type : "double" } , { name : "crop_top" , type : "double" } , { name : "crop_width" , type : "double" } ] , type : "InputPhotoCrop" } , { id : "1996904104" , predicate : "inputAppEvent" , params : [ { name : "time" , type : "double" } , { name : "type" , type : "string" } , { name : "peer" , type : "long" } , { name : "data" , type : "string" } ] , type : "InputAppEvent" } , { id : "-1649296275" , predicate : "peerUser" , params : [ { name : "user_id" , type : "int" } ] , type : "Peer" } , { id : "-1160714821" , predicate : "peerChat" , params : [ { name : "chat_id" , type : "int" } ] , type : "Peer" } , { id : "-1432995067" , predicate : "storage.fileUnknown" , params : [ ] , type : "storage.FileType" } , { id : "8322574" , predicate : "storage.fileJpeg" , params : [ ] , type : "storage.FileType" } , { id : "-891180321" , predicate : "storage.fileGif" , params : [ ] , type : "storage.FileType" } , { id : "172975040" , predicate : "storage.filePng" , params : [ ] , type : "storage.FileType" } , { id : "-1373745011" , predicate : "storage.filePdf" , params : [ ] , type : "storage.FileType" } , { id : "1384777335" , predicate : "storage.fileMp3" , params : [ ] , type : "storage.FileType" } , { id : "1258941372" , predicate : "storage.fileMov" , params : [ ] , type : "storage.FileType" } , { id : "1086091090" , predicate : "storage.filePartial" , params : [ ] , type : "storage.FileType" } , { id : "-1278304028" ,
params : [ ] , type : "SendMessageAction" } , { id : "-378127636" , predicate : "sendMessageUploadVideoAction" , params : [ { name : "progress" , type : "int" } ] , type : "SendMessageAction" } , { id : "-718310409" , predicate : "sendMessageRecordAudioAction" , params : [ ] , type : "SendMessageAction" } , { id : "-212740181" , predicate : "sendMessageUploadAudioAction" , params : [ { name : "progress" , type : "int" } ] , type : "SendMessageAction" } , { id : "-774682074" , predicate : "sendMessageUploadPhotoAction" , params : [ { name : "progress" , type : "int" } ] , type : "SendMessageAction" } , { id : "-1441998364" , predicate : "sendMessageUploadDocumentAction" , params : [ { name : "progress" , type : "int" } ] , type : "SendMessageAction" } , { id : "393186209" , predicate : "sendMessageGeoLocationAction" , params : [ ] , type : "SendMessageAction" } , { id : "1653390447" , predicate : "sendMessageChooseContactAction" , params : [ ] , type : "SendMessageAction" } , { id : "446822276" , predicate : "contacts.found" , params : [ { name : "results" , type : "Vector<Peer>" } , { name : "chats" , type : "Vector<Chat>" } , { name : "users" , type : "Vector<User>" } ] , type : "contacts.Found" } , { id : "942527460" , predicate : "updateServiceNotification" , params : [ { name : "type" , type : "string" } , { name : "message" , type : "string" } , { name : "media" , type : "MessageMedia" } , { name : "popup" , type : "Bool" } ] , type : "Update" } , { id : "-496024847" , predicate : "userStatusRecently" , params : [ ] , type : "UserStatus" } , { id : "129960444" , predicate : "userStatusLastWeek" , params : [ ] , type : "UserStatus" } , { id : "2011940674" , predicate : "userStatusLastMonth" , params : [ ] , type : "UserStatus" } , { id : "-298113238" , predicate : "updatePrivacy" , params : [ { name : "key" , type : "PrivacyKey" } , { name : "rules" , type : "Vector<PrivacyRule>" } ] , type : "Update" } , { id : "1335282456" , predicate : "inputPrivacyKeyStatusTimestamp" , params : [ ] , type : "InputPrivacyKey" } , { id : "-1137792208" , predicate : "privacyKeyStatusTimestamp" , params : [ ] , type : "PrivacyKey" } , { id : "218751099" , predicate : "inputPrivacyValueAllowContacts" , params : [ ] , type : "InputPrivacyRule" } , { id : "407582158" , predicate : "inputPrivacyValueAllowAll" , params : [ ] , type : "InputPrivacyRule" } , { id : "320652927" , predicate : "inputPrivacyValueAllowUsers" , params : [ { name : "users" , type : "Vector<InputUser>" } ] , type : "InputPrivacyRule" } , { id : "195371015" , predicate : "inputPrivacyValueDisallowContacts" , params : [ ] , type : "InputPrivacyRule" } , { id : "-697604407" , predicate : "inputPrivacyValueDisallowAll" , params : [ ] , type : "InputPrivacyRule" } , { id : "-1877932953" , predicate : "inputPrivacyValueDisallowUsers" , params : [ { name : "users" , type : "Vector<InputUser>" } ] , type : "InputPrivacyRule" } , { id : "-123988" , predicate : "privacyValueAllowContacts" , params : [ ] , type : "PrivacyRule" } , { id : "1698855810" , predicate : "privacyValueAllowAll" , params : [ ] , type : "PrivacyRule" } , { id : "1297858060" , predicate : "privacyValueAllowUsers" , params : [ { name : "users" , type : "Vector<int>" } ] , type : "PrivacyRule" } , { id : "-125240806" , predicate : "privacyValueDisallowContacts" , params : [ ] , type : "PrivacyRule" } , { id : "-1955338397" , predicate : "privacyValueDisallowAll" , params : [ ] , type : "PrivacyRule" } , { id : "209668535" , predicate : "privacyValueDisallowUsers" , params : [ { name : "users" , type : "Vector<int>" } ] , type : "PrivacyRule" } , { id : "1430961007" , predicate : "account.privacyRules" , params : [ { name : "rules" , type : "Vector<PrivacyRule>" } , { name : "users" , type : "Vector<User>" } ] , type : "account.PrivacyRules" } , { id : "-1194283041" , predicate : "accountDaysTTL" , params : [ { name : "days" , type : "int" } ] , type : "AccountDaysTTL" } , { id : "314130811" , predicate : "updateUserPhone" , params : [ { name : "user_id" , type : "int" } , { name : "phone" , type : "string" } ] , type : "Update" } , { id : "1815593308" , predicate : "documentAttributeImageSize" , params : [ { name : "w" , type : "int" } , { name : "h" , type : "int" } ] , type : "DocumentAttribute" } , { id : "297109817" , predicate : "documentAttributeAnimated" , params : [ ] , type : "DocumentAttribute" } , { id : "978674434" , predicate : "documentAttributeSticker" , params : [ { name : "alt" , type : "string" } , { name : "stickerset" , type : "InputStickerSet" } ] , type : "DocumentAttribute" } , { id : "1494273227" , predicate : "documentAttributeVideo" , params : [ { name : "duration" , type : "int" } , { name : "w" , type : "int" } , { name : "h" , type : "int" } ] , type : "DocumentAttribute" } , { id : "-1739392570" , predicate : "documentAttributeAudio" , params : [ { name : "flags" , type : "#" } , { name : "voice" , type : "flags.10?true" } , { name : "duration" , type : "int" } , { name : "title" , type : "flags.0?string" } , { name : "performer" , type : " fla
type : "string" } , { name : "reply_markup" , type : "flags.2?ReplyMarkup" } ] , type : "InputBotInlineMessage" } , { id : "982505656" , predicate : "botInlineMessageMediaGeo" , params : [ { name : "flags" , type : "#" } , { name : "geo" , type : "GeoPoint" } , { name : "reply_markup" , type : "flags.2?ReplyMarkup" } ] , type : "BotInlineMessage" } , { id : "1130767150" , predicate : "botInlineMessageMediaVenue" , params : [ { name : "flags" , type : "#" } , { name : "geo" , type : "GeoPoint" } , { name : "title" , type : "string" } , { name : "address" , type : "string" } , { name : "provider" , type : "string" } , { name : "venue_id" , type : "string" } , { name : "reply_markup" , type : "flags.2?ReplyMarkup" } ] , type : "BotInlineMessage" } , { id : "904770772" , predicate : "botInlineMessageMediaContact" , params : [ { name : "flags" , type : "#" } , { name : "phone_number" , type : "string" } , { name : "first_name" , type : "string" } , { name : "last_name" , type : "string" } , { name : "reply_markup" , type : "flags.2?ReplyMarkup" } ] , type : "BotInlineMessage" } , { id : "-1462213465" , predicate : "inputBotInlineResultPhoto" , params : [ { name : "id" , type : "string" } , { name : "type" , type : "string" } , { name : "photo" , type : "InputPhoto" } , { name : "send_message" , type : "InputBotInlineMessage" } ] , type : "InputBotInlineResult" } , { id : "-459324" , predicate : "inputBotInlineResultDocument" , params : [ { name : "flags" , type : "#" } , { name : "id" , type : "string" } , { name : "type" , type : "string" } , { name : "title" , type : "flags.1?string" } , { name : "description" , type : "flags.2?string" } , { name : "document" , type : "InputDocument" } , { name : "send_message" , type : "InputBotInlineMessage" } ] , type : "InputBotInlineResult" } , { id : "400266251" , predicate : "botInlineMediaResult" , params : [ { name : "flags" , type : "#" } , { name : "id" , type : "string" } , { name : "type" , type : "string" } , { name : "photo" , type : "flags.0?Photo" } , { name : "document" , type : "flags.1?Document" } , { name : "title" , type : "flags.2?string" } , { name : "description" , type : "flags.3?string" } , { name : "send_message" , type : "BotInlineMessage" } ] , type : "BotInlineResult" } , { id : "-1995686519" , predicate : "inputBotInlineMessageID" , params : [ { name : "dc_id" , type : "int" } , { name : "id" , type : "long" } , { name : "access_hash" , type : "long" } ] , type : "InputBotInlineMessageID" } , { id : "750622127" , predicate : "updateInlineBotCallbackQuery" , params : [ { name : "query_id" , type : "long" } , { name : "user_id" , type : "int" } , { name : "msg_id" , type : "InputBotInlineMessageID" } , { name : "data" , type : "bytes" } ] , type : "Update" } , { id : "1008755359" , predicate : "inlineBotSwitchPM" , params : [ { name : "text" , type : "string" } , { name : "start_param" , type : "string" } ] , type : "InlineBotSwitchPM" } , { id : "863093588" , predicate : "messages.peerDialogs" , params : [ { name : "dialogs" , type : "Vector<Dialog>" } , { name : "messages" , type : "Vector<Message>" } , { name : "chats" , type : "Vector<Chat>" } , { name : "users" , type : "Vector<User>" } , { name : "state" , type : "updates.State" } ] , type : "messages.PeerDialogs" } , { id : "-305282981" , predicate : "topPeer" , params : [ { name : "peer" , type : "Peer" } , { name : "rating" , type : "double" } ] , type : "TopPeer" } , { id : "-1419371685" , predicate : "topPeerCategoryBotsPM" , params : [ ] , type : "TopPeerCategory" } , { id : "344356834" , predicate : "topPeerCategoryBotsInline" , params : [ ] , type : "TopPeerCategory" } , { id : "104314861" , predicate : "topPeerCategoryCorrespondents" , params : [ ] , type : "TopPeerCategory" } , { id : "-1122524854" , predicate : "topPeerCategoryGroups" , params : [ ] , type : "TopPeerCategory" } , { id : "371037736" , predicate : "topPeerCategoryChannels" , params : [ ] , type : "TopPeerCategory" } , { id : "-75283823" , predicate : "topPeerCategoryPeers" , params : [ { name : "category" , type : "TopPeerCategory" } , { name : "count" , type : "int" } , { name : "peers" , type : "Vector<TopPeer>" } ] , type : "TopPeerCategoryPeers" } , { id : "-567906571" , predicate : "contacts.topPeersNotModified" , params : [ ] , type : "contacts.TopPeers" } , { id : "1891070632" , predicate : "contacts.topPeers" , params : [ { name : "categories" , type : "Vector<TopPeerCategoryPeers>" } , { name : "chats" , type : "Vector<Chat>" } , { name : "users" , type : "Vector<User>" } ] , type : "contacts.TopPeers" } , { id : "892193368" , predicate : "messageEntityMentionName" , params : [ { name : "offset" , type : "int" } , { name : "length" , type : "int" } , { name : "user_id" , type : "int" } ] , type : "MessageEntity" } , { id : "546203849" , predicate : "inputMessageEntityMentionName" , params : [ { name : "offset" , type : "int" } , { name : "length" , type : "int" } , { name : "user_id" , type : "InputUser" } ] , type : "MessageEntity" } , { id : "975236280" , predicate : "inputMessagesFilterChatPhotos" , params : [ ] , type : "MessagesFilter"
"25fe" : [ "◾" , [ "black_medium_small_square" ] ] , 2600 : [ "☀" , [ "sunny" ] ] , 2601 : [ "☁" , [ "cloud" ] ] , "260e" : [ "☎" , [ "phone" , "telephone" ] ] , 2611 : [ "☑" , [ "ballot_box_with_check" ] ] , 2614 : [ "☔" , [ "umbrella" ] ] , 2615 : [ "☕" , [ "coffee" ] ] , "261d" : [ "☝" , [ "point_up" ] ] , "263a" : [ "☺" , [ "relaxed" ] ] , 2648 : [ "♈" , [ "aries" ] ] , 2649 : [ "♉" , [ "taurus" ] ] , "264a" : [ "♊" , [ "gemini" ] ] , "264b" : [ "♋" , [ "cancer" ] ] , "264c" : [ "♌" , [ "leo" ] ] , "264d" : [ "♍" , [ "virgo" ] ] , "264e" : [ "♎" , [ "libra" ] ] , "264f" : [ "♏" , [ "scorpius" ] ] , 2650 : [ "♐" , [ "sagittarius" ] ] , 2651 : [ "♑" , [ "capricorn" ] ] , 2652 : [ "♒" , [ "aquarius" ] ] , 2653 : [ "♓" , [ "pisces" ] ] , 2660 : [ "♠" , [ "spades" ] ] , 2663 : [ "♣" , [ "clubs" ] ] , 2665 : [ "♥" , [ "hearts" ] ] , 2666 : [ "♦" , [ "diamonds" ] ] , 2668 : [ "♨" , [ "hotsprings" ] ] , "267b" : [ "♻" , [ "recycle" ] ] , "267f" : [ "♿" , [ "wheelchair" ] ] , 2693 : [ "⚓" , [ "anchor" ] ] , "26a0" : [ "⚠" , [ "warning" ] ] , "26a1" : [ "⚡" , [ "zap" ] ] , "26aa" : [ "⚪" , [ "white_circle" ] ] , "26ab" : [ "⚫" , [ "black_circle" ] ] , "26bd" : [ "⚽" , [ "soccer" ] ] , "26be" : [ "⚾" , [ "baseball" ] ] , "26c4" : [ "⛄" , [ "snowman" ] ] , "26c5" : [ "⛅" , [ "partly_sunny" ] ] , "26ce" : [ "⛎" , [ "ophiuchus" ] ] , "26d4" : [ "⛔" , [ "no_entry" ] ] , "26ea" : [ "⛪" , [ "church" ] ] , "26f2" : [ "⛲" , [ "fountain" ] ] , "26f3" : [ "⛳" , [ "golf" ] ] , "26f5" : [ "⛵" , [ "boat" , "sailboat" ] ] , "26fa" : [ "⛺" , [ "tent" ] ] , "26fd" : [ "⛽" , [ "fuelpump" ] ] , 2702 : [ "✂" , [ "scissors" ] ] , 2705 : [ "✅" , [ "white_check_mark" ] ] , 2708 : [ "✈" , [ "airplane" ] ] , 2709 : [ "✉" , [ "email" , "envelope" ] ] , "270a" : [ "✊" , [ "fist" ] ] , "270b" : [ "✋" , [ "hand" , "raised_hand" ] ] , "270c" : [ "✌" , [ "v" ] ] , "270f" : [ "✏" , [ "pencil2" ] ] , 2712 : [ "✒" , [ "black_nib" ] ] , 2714 : [ "✔" , [ "heavy_check_mark" ] ] , 2716 : [ "✖" , [ "heavy_multiplication_x" ] ] , 2728 : [ "✨" , [ "sparkles" ] ] , 2733 : [ "✳" , [ "eight_spoked_asterisk" ] ] , 2734 : [ "✴" , [ "eight_pointed_black_star" ] ] , 2744 : [ "❄" , [ "snowflake" ] ] , 2747 : [ "❇" , [ "sparkle" ] ] , "274c" : [ "❌" , [ "x" ] ] , "274e" : [ "❎" , [ "negative_squared_cross_mark" ] ] , 2753 : [ "❓" , [ "question" ] ] , 2754 : [ "❔" , [ "grey_question" ] ] , 2755 : [ "❕" , [ "grey_exclamation" ] ] , 2757 : [ "❗" , [ "exclamation" , "heavy_exclamation_mark" ] ] , 2764 : [ "❤" , [ "heart" ] , "<3" ] , 2795 : [ "➕" , [ "heavy_plus_sign" ] ] , 2796 : [ "➖" , [ "heavy_minus_sign" ] ] , 2797 : [ "➗" , [ "heavy_division_sign" ] ] , "27a1" : [ "➡" , [ "arrow_right" ] ] , "27b0" : [ "➰" , [ "curly_loop" ] ] , "27bf" : [ "➿" , [ "loop" ] ] , 2934 : [ "⤴" , [ "arrow_heading_up" ] ] , 2935 : [ "⤵" , [ "arrow_heading_down" ] ] , "2b05" : [ "⬅" , [ "arrow_left" ] ] , "2b06" : [ "⬆" , [ "arrow_up" ] ] , "2b07" : [ "⬇" , [ "arrow_down" ] ] , "2b1b" : [ "⬛" , [ "black_large_square" ] ] , "2b1c" : [ "⬜" , [ "white_large_square" ] ] , "2b50" : [ "⭐" , [ "star" ] ] , "2b55" : [ "⭕" , [ "o" ] ] , 3030 : [ "〰" , [ "wavy_dash" ] ] , "303d" : [ "〽" , [ "part_alternation_mark" ] ] , 3297 : [ "㊗" , [ "congratulations" ] ] , 3299 : [ "㊙" , [ "secret" ] ] , "1f004" : [ "🀄" , [ "mahjong" ] ] , "1f0cf" : [ "🃏" , [ "black_joker" ] ] , "1f170" : [ "🅰" , [ "a" ] ] , "1f171" : [ "🅱" , [ "b" ] ] , "1f17e" : [ "🅾" , [ "o2" ] ] , "1f17f" : [ "🅿" , [ "parking" ] ] , "1f18e" : [ "🆎" , [ "ab" ] ] , "1f191" : [ "🆑" , [ "cl" ] ] , "1f192" : [ "🆒" , [ "cool" ] ] , "1f193" : [ "🆓" , [ "free" ] ] , "1f194" : [ "🆔" , [ "id" ] ] , "1f195" : [ "🆕" , [ "new" ] ] , "1f196" : [ "🆖" , [ "ng" ] ] , "1f197" : [ "🆗" , [ "ok" ] ] , "1f198" : [ "🆘" , [ "sos" ] ] , "1f199" : [ "🆙" , [ "up" ] ] , "1f19a" : [ "🆚" , [ "vs" ] ] , "1f201" : [ "🈁" , [ "koko" ] ] , "1f202" : [ "🈂" , [ "sa" ] ] , "1f21a" : [ "🈚" , [ "u7121" ] ] , "1f22f" : [ "🈯" , [ "u6307" ] ] , "1f232" : [ "🈲" , [ "u7981" ] ] , "1f233" : [ "🈳" , [ "u7a7a" ] ] , "1f234" : [ "🈴" , [ "u5408" ] ] , "1f235" : [ "🈵" , [ "u6e80" ] ] , "1f236" : [ "🈶" , [ "u6709" ] ] , "1f237" : [ "🈷" , [ "u6708" ] ] , "1f238" : [ "🈸" , [ "u7533" ] ] , "1f239" : [ "🈹" , [ "u5272" ] ] , "1f23a" : [ "🈺" , [ "u55b6" ] ] , "1f250" : [ "🉐" , [ "ideograph_advantage" ] ] , "1f251" : [ "🉑" , [ "accept" ] ] , "1f300" : [ "🌀" , [ "cyclone" ] ] , "1f301" : [ "🌁" , [ "foggy" ] ] , "1f302" : [ "🌂" , [ "closed_umbrella" ] ] , "1f303" : [ "🌃" , [ "night_with_stars" ] ] , "1f304" : [ "🌄" , [ "sunrise_over_mountains" ] ] , "1f305" : [ "🌅" , [ "sunrise" ] ] , "1f306" : [ "🌆" , [ "city_sunset" ] ] , "1f307" : [ "🌇" , [ "city_sunrise" ] ] , "1f308" : [ "🌈" , [ "rainbow" ] ] , "1f309" : [ "🌉" , [ "bridge_at_night" ] ] , "1f30a" : [ "🌊" , [ "ocean" ] ] , "1f30b" : [ "🌋" , [ "volcano" ] ] , "1f30c" : [ "🌌" , [ "milky_way" ] ] , "1f30d" : [ "🌍" , [ "earth_africa" ] ] , "1f30e" : [ "🌎" , [ "earth_americas" ] ] , "1f30f" : [ "🌏" , [ "earth_asia" ] ] , "1f310" : [ "🌐" , [ "globe_with_meridians" ] ] , "1f311" : [ "🌑" , [ "new_moon" ] ] , "1f312" : [ "🌒" , [ "waxing_crescent_moon" ] ] , "1f313" : [ "🌓" , [ "first_quarter_moon" ] ] , "1f314" : [ " <EFBFBD>
"Nj" : "N" , "Ñ" : "N" , "NJ" : "NJ" , "Ó" : "O" , "Ŏ" : "O" , "Ǒ" : "O" , "Ô" : "O" , "Ố" : "O" , "Ộ" : "O" , "Ồ" : "O" , "Ổ" : "O" , "Ỗ" : "O" , "Ö" : "O" , "Ȫ" : "O" , "Ȯ" : "O" , "Ȱ" : "O" , "Ọ" : "O" , "Ő" : "O" , "Ȍ" : "O" , "Ò" : "O" , "Ỏ" : "O" , "Ơ" : "O" , "Ớ" : "O" , "Ợ" : "O" , "Ờ" : "O" , "Ở" : "O" , "Ỡ" : "O" , "Ȏ" : "O" , "Ꝋ" : "O" , "Ꝍ" : "O" , "Ō" : "O" , "Ṓ" : "O" , "Ṑ" : "O" , "Ɵ" : "O" , "Ǫ" : "O" , "Ǭ" : "O" , "Ø" : "O" , "Ǿ" : "O" , "Õ" : "O" , "Ṍ" : "O" , "Ṏ" : "O" , "Ȭ" : "O" , "Ƣ" : "OI" , "Ꝏ" : "OO" , "Ɛ" : "E" , "Ɔ" : "O" , "Ȣ" : "OU" , "Ṕ" : "P" , "Ṗ" : "P" , "Ꝓ" : "P" , "Ƥ" : "P" , "Ꝕ" : "P" , "Ᵽ" : "P" , "Ꝑ" : "P" , "Ꝙ" : "Q" , "Ꝗ" : "Q" , "Ŕ" : "R" , "Ř" : "R" , "Ŗ" : "R" , "Ṙ" : "R" , "Ṛ" : "R" , "Ṝ" : "R" , "Ȑ" : "R" , "Ȓ" : "R" , "Ṟ" : "R" , "Ɍ" : "R" , "Ɽ" : "R" , "Ꜿ" : "C" , "Ǝ" : "E" , "Ś" : "S" , "Ṥ" : "S" , "Š" : "S" , "Ṧ" : "S" , "Ş" : "S" , "Ŝ" : "S" , "Ș" : "S" , "Ṡ" : "S" , "Ṣ" : "S" , "Ṩ" : "S" , "ẞ" : "SS" , "Ť" : "T" , "Ţ" : "T" , "Ṱ" : "T" , "Ț" : "T" , "Ⱦ" : "T" , "Ṫ" : "T" , "Ṭ" : "T" , "Ƭ" : "T" , "Ṯ" : "T" , "Ʈ" : "T" , "Ŧ" : "T" , "Ɐ" : "A" , "Ꞁ" : "L" , "Ɯ" : "M" , "Ʌ" : "V" , "Ꜩ" : "TZ" , "Ú" : "U" , "Ŭ" : "U" , "Ǔ" : "U" , "Û" : "U" , "Ṷ" : "U" , "Ü" : "U" , "Ǘ" : "U" , "Ǚ" : "U" , "Ǜ" : "U" , "Ǖ" : "U" , "Ṳ" : "U" , "Ụ" : "U" , "Ű" : "U" , "Ȕ" : "U" , "Ù" : "U" , "Ủ" : "U" , "Ư" : "U" , "Ứ" : "U" , "Ự" : "U" , "Ừ" : "U" , "Ử" : "U" , "Ữ" : "U" , "Ȗ" : "U" , "Ū" : "U" , "Ṻ" : "U" , "Ų" : "U" , "Ů" : "U" , "Ũ" : "U" , "Ṹ" : "U" , "Ṵ" : "U" , "Ꝟ" : "V" , "Ṿ" : "V" , "Ʋ" : "V" , "Ṽ" : "V" , "Ꝡ" : "VY" , "Ẃ" : "W" , "Ŵ" : "W" , "Ẅ" : "W" , "Ẇ" : "W" , "Ẉ" : "W" , "Ẁ" : "W" , "Ⱳ" : "W" , "Ẍ" : "X" , "Ẋ" : "X" , "Ý" : "Y" , "Ŷ" : "Y" , "Ÿ" : "Y" , "Ẏ" : "Y" , "Ỵ" : "Y" , "Ỳ" : "Y" , "Ƴ" : "Y" , "Ỷ" : "Y" , "Ỿ" : "Y" , "Ȳ" : "Y" , "Ɏ" : "Y" , "Ỹ" : "Y" , "Ź" : "Z" , "Ž" : "Z" , "Ẑ" : "Z" , "Ⱬ" : "Z" , "Ż" : "Z" , "Ẓ" : "Z" , "Ȥ" : "Z" , "Ẕ" : "Z" , "Ƶ" : "Z" , "IJ" : "IJ" , "Œ" : "OE" , "ᴀ" : "A" , "ᴁ" : "AE" , "ʙ" : "B" , "ᴃ" : "B" , "ᴄ" : "C" , "ᴅ" : "D" , "ᴇ" : "E" , "ꜰ" : "F" , "ɢ" : "G" , "ʛ" : "G" , "ʜ" : "H" , "ɪ" : "I" , "ʁ" : "R" , "ᴊ" : "J" , "ᴋ" : "K" , "ʟ" : "L" , "ᴌ" : "L" , "ᴍ" : "M" , "ɴ" : "N" , "ᴏ" : "O" , "ɶ" : "OE" , "ᴐ" : "O" , "ᴕ" : "OU" , "ᴘ" : "P" , "ʀ" : "R" , "ᴎ" : "N" , "ᴙ" : "R" , "ꜱ" : "S" , "ᴛ" : "T" , "ⱻ" : "E" , "ᴚ" : "R" , "ᴜ" : "U" , "ᴠ" : "V" , "ᴡ" : "W" , "ʏ" : "Y" , "ᴢ" : "Z" , "á" : "a" , "ă" : "a" , "ắ" : "a" , "ặ" : "a" , "ằ" : "a" , "ẳ" : "a" , "ẵ" : "a" , "ǎ" : "a" , "â" : "a" , "ấ" : "a" , "ậ" : "a" , "ầ" : "a" , "ẩ" : "a" , "ẫ" : "a" , "ä" : "a" , "ǟ" : "a" , "ȧ" : "a" , "ǡ" : "a" , "ạ" : "a" , "ȁ" : "a" , "à" : "a" , "ả" : "a" , "ȃ" : "a" , "ā" : "a" , "ą" : "a" , "ᶏ" : "a" , "ẚ" : "a" , "å" : "a" , "ǻ" : "a" , "ḁ" : "a" , "ⱥ" : "a" , "ã" : "a" , "ꜳ" : "aa" , "æ" : "ae" , "ǽ" : "ae" , "ǣ" : "ae" , "ꜵ" : "ao" , "ꜷ" : "au" , "ꜹ" : "av" , "ꜻ" : "av" , "ꜽ" : "ay" , "ḃ" : "b" , "ḅ" : "b" , "ɓ" : "b" , "ḇ" : "b" , "ᵬ" : "b" , "ᶀ" : "b" , "ƀ" : "b" , "ƃ" : "b" , "ɵ" : "o" , "ć" : "c" , "č" : "c" , "ç" : "c" , "ḉ" : "c" , "ĉ" : "c" , "ɕ" : "c" , "ċ" : "c" , "ƈ" : "c" , "ȼ" : "c" , "ď" : "d" , "ḑ" : "d" , "ḓ" : "d" , "ȡ" : "d" , "ḋ" : "d" , "ḍ" : "d" , "ɗ" : "d" , "ᶑ" : "d" , "ḏ" : "d" , "ᵭ" : "d" , "ᶁ" : "d" , "đ" : "d" , "ɖ" : "d" , "ƌ" : "d" , "ı" : "i" , "ȷ" : "j" , "ɟ" : "j" , "ʄ" : "j" , "dz" : "dz" , "dž" : "dz" , "é" : "e" , "ĕ" : "e" , "ě" : "e" , "ȩ" : "e" , "ḝ" : "e" , "ê" : "e" , "ế" : "e" , "ệ" : "e" , "ề" : "e" , "ể" : "e" , "ễ" : "e" , "ḙ" : "e" , "ë" : "e" , "ė" : "e" , "ẹ" : "e" , "ȅ" : "e" , "è" : "e" , "ẻ" : "e" , "ȇ" : "e" , "ē" : "e" , "ḗ" : "e" , "ḕ" : "e" , "ⱸ" : "e" , "ę" : "e" , "ᶒ" : "e" , "ɇ" : "e" , "ẽ" : "e" , "ḛ" : "e" , "ꝫ" : "et" , "ḟ" : "f" , "ƒ" : "f" , "ᵮ" : "f" , "ᶂ" : "f" , "ǵ" : "g" , "ğ" : "g" , "ǧ" : "g" , "ģ" : "g" , "ĝ" : "g" , "ġ" : "g" , "ɠ" : "g" , "ḡ" : "g" , "ᶃ" : "g" , "ǥ" : "g" , "ḫ" : "h" , "ȟ" : "h" , "ḩ" : "h" , "ĥ" : "h" , "ⱨ" : "h" , "ḧ" : "h" , "ḣ" : "h" , "ḥ" : "h" , "ɦ" : "h" , "ẖ" : "h" , "ħ" : "h" , "ƕ" : "hv" , "í" : "i" , "ĭ" : "i" , "ǐ" : "i" , "î" : "i" , "ï" : "i" , "ḯ" : "i" , "ị" : "i" , "ȉ" : "i" , "ì" : "i" , "ỉ" : "i" , "ȋ" : "i" , "ī" : "i" , "į" : "i" , "ᶖ" : "i" , "ɨ" : "i" , "ĩ" : "i" , "ḭ" : "i" , "ꝺ" : "d" , "ꝼ" : "f" , "ᵹ" : "g" , "ꞃ" : "r" , "ꞅ" : "s" , "ꞇ" : "t" , "ꝭ" : "is" , "ǰ" : "j" , "ĵ" : "j" , "ʝ" : "j" , "ɉ" : "j" , "ḱ" : "k" , "ǩ" : "k" , "ķ" : "k" , "ⱪ" : "k" , "ꝃ" : "k" , "ḳ" : "k" , "ƙ" : "k" , "ḵ" : "k" , "ᶄ" : "k" , "ꝁ" : "k" , "ꝅ" : "k" , "ĺ" : "l" , "ƚ" : "l" , "ɬ" : "l" , "ľ" : "l" , "ļ" : "l" , "ḽ" : "l" , "ȴ" : "l" , "ḷ" : "l" , "ḹ" : "l" , "ⱡ" : "l" , "ꝉ" : "l" , "ḻ" : "l" , "ŀ" : "l" , "ɫ" : "l" , "ᶅ" : "l" , "ɭ" : "l" , "ł" : "l" , "lj" : "lj" , "ſ" : "s" , "ẜ" : "s" , "ẛ" : "s" , "ẝ" : "s" , "ḿ" : "m" , "ṁ" : "m" , "ṃ" : "m" , "ɱ" : "m" , "ᵯ" : "m" , "ᶆ" : "m" , "ń" : "n" , "ň" : "n" , "ņ" : "n" , "ṋ" : "n" , "ȵ" : "n" , "ṅ" : "n" , "ṇ" : "n" , "ǹ" : "n" , "ɲ" : "n" , "ṉ" : "n" , "ƞ" : "n" , "ᵰ" : "n" , "ᶇ" : "n" , "ɳ" : "n" , "ñ" : "n" , "nj" : "nj" , "ó" : "o" , "ŏ" : "o" , "ǒ" : "o" , "ô" : "o" , "ố" : "o" , "ộ" : "o" , "ồ" : "o" , "ổ" : "o" , "ỗ" : "o" , "ö" : "o" , "ȫ" : "o" , "ȯ" : "o" ,
if ( e . extend ( a . options , t ) , null != t . scrollBottom ) return a . scrollBottom ( t . scrollBottom ) ; if ( null != t . scrollTop ) return a . scrollTop ( t . scrollTop ) ; if ( t . scrollTo ) return a . scrollTo ( t . scrollTo ) ; if ( "bottom" === t . scroll ) return a . scrollBottom ( 0 ) ; if ( "top" === t . scroll ) return a . scrollTop ( 0 ) ; if ( t . scroll && t . scroll instanceof e ) return a . scrollTo ( t . scroll ) ; if ( t . stop ) return a . stop ( ) ; if ( t . destroy ) return a . destroy ( ) ; if ( t . flash ) return a . flash ( ) } return a . reset ( ) } ) } , e . fn . nanoScroller . Constructor = f } ( jQuery , window , document ) , function ( e ) { "use strict" ; function t ( e , t ) { return t = t || Error , function ( ) { var n , a , i = 2 , o = arguments , s = o [ 0 ] , r = "[" + ( e ? e + ":" : "" ) + s + "] " , l = o [ 1 ] ; for ( r += l . replace ( /\{\d+\}/g , function ( e ) { var t = + e . slice ( 1 , - 1 ) , n = t + i ; return n < o . length ? ve ( o [ n ] ) : e } ) , r += "\nhttp://errors.angularjs.org/1.5.7/" + ( e ? e + "/" : "" ) + s , a = i , n = "?" ; a < o . length ; a ++ , n = "&" ) r += n + "p" + ( a - i ) + "=" + encodeURIComponent ( ve ( o [ a ] ) ) ; return new t ( r ) } } function n ( e ) { if ( null == e || M ( e ) ) return ! 1 ; if ( Ya ( e ) || w ( e ) || Ua && e instanceof Ua ) return ! 0 ; var t = "length" in Object ( e ) && e . length ; return k ( t ) && ( t >= 0 && ( t - 1 in e || e instanceof Array ) || "function" == typeof e . item ) } function a ( e , t , i ) { var o , s ; if ( e ) if ( C ( e ) ) for ( o in e ) "prototype" == o || "length" == o || "name" == o || e . hasOwnProperty && ! e . hasOwnProperty ( o ) || t . call ( i , e [ o ] , o , e ) ; else if ( Ya ( e ) || n ( e ) ) { var r = "object" != typeof e ; for ( o = 0 , s = e . length ; o < s ; o ++ ) ( r || o in e ) && t . call ( i , e [ o ] , o , e ) } else if ( e . forEach && e . forEach !== a ) e . forEach ( t , i , e ) ; else if ( b ( e ) ) for ( o in e ) t . call ( i , e [ o ] , o , e ) ; else if ( "function" == typeof e . hasOwnProperty ) for ( o in e ) e . hasOwnProperty ( o ) && t . call ( i , e [ o ] , o , e ) ; else for ( o in e ) Da . call ( e , o ) && t . call ( i , e [ o ] , o , e ) ; return e } function i ( e , t , n ) { for ( var a = Object . keys ( e ) . sort ( ) , i = 0 ; i < a . length ; i ++ ) t . call ( n , e [ a [ i ] ] , a [ i ] ) ; return a } function o ( e ) { return function ( t , n ) { e ( n , t ) } } function s ( ) { return ++ Ka } function r ( e , t ) { t ? e . $$hashKey = t : delete e . $$hashKey } function l ( e , t , n ) { for ( var a = e . $$hashKey , i = 0 , o = t . length ; i < o ; ++ i ) { var s = t [ i ] ; if ( y ( s ) || C ( s ) ) for ( var c = Object . keys ( s ) , d = 0 , u = c . length ; d < u ; d ++ ) { var p = c [ d ] , m = s [ p ] ; n && y ( m ) ? $ ( m ) ? e [ p ] = new Date ( m . valueOf ( ) ) : S ( m ) ? e [ p ] = new RegExp ( m ) : m . nodeName ? e [ p ] = m . cloneNode ( ! 0 ) : N ( m ) ? e [ p ] = m . clone ( ) : ( y ( e [ p ] ) || ( e [ p ] = Ya ( m ) ? [ ] : { } ) , l ( e [ p ] , [ m ] , ! 0 ) ) : e [ p ] = m } } return r ( e , a ) , e } function c ( e ) { return l ( e , ja . call ( arguments , 1 ) , ! 1 ) } function d ( e ) { return l ( e , ja . call ( arguments , 1 ) , ! 0 ) } function u ( e ) { return parseInt ( e , 10 ) } function p ( e , t ) { return c ( Object . create ( e ) , t ) } function m ( ) { } function g ( e ) { return e } function h ( e ) { return function ( ) { return e } } function f ( e ) { return C ( e . toString ) && e . toString !== Va } function _ ( e ) { return "undefined" == typeof e } function v ( e ) { return "undefined" != typeof e } function y ( e ) { return null !== e && "object" == typeof e } function b ( e ) { return null !== e && "object" == typeof e && ! za ( e ) } function w ( e ) { return "string" == typeof e } function k ( e ) { return "number" == typeof e } function $ ( e ) { return "[object Date]" === Va . call ( e ) } function C ( e ) { return "function" == typeof e } function S ( e ) { return "[object RegExp]" === Va . call ( e ) } function M ( e ) { return e && e . window === e } function x ( e ) { return e && e . $evalAsync && e . $watch } function I ( e ) { return "[object File]" === Va . call ( e ) } function A ( e ) { return "[object FormData]" === Va . call ( e ) } function E ( e ) { return "[object Blob]" === Va . call ( e ) } function T ( e ) { return "boolean" == typeof e } function D ( e ) { return e && C ( e . then ) } function P ( e ) { return e && k ( e . length ) && Za . test ( Va . call ( e ) ) } function F ( e ) { return "[object ArrayBuffer]" === Va . call ( e ) } function N ( e ) { return ! ( ! e || ! ( e . nodeName || e . prop && e . attr && e . find ) ) } function R ( e ) { var t , n = { } , a = e . split ( "," ) ; for ( t = 0 ; t < a . length ; t ++ ) n [ a [ t ] ] = ! 0 ; return n } function O ( e ) { return Pa ( e . nodeName || e [ 0 ] && e [ 0 ] . nodeName ) } function U ( e , t ) { var n = e . indexOf ( t ) ; return n >= 0 && e . splice ( n , 1 ) , n } function L ( e , t ) { function n ( e , t ) { var n , a = t . $$hashKey ; if ( Ya ( e ) ) for ( var o = 0 , s = e . length ; o < s ; o ++ ) t . push ( i ( e [ o ] ) ) ; else if ( b ( e ) ) for ( n in e ) t [ n ] = i ( e [ n ] ) ; else if ( e && "function" == typeof e . hasOwnProperty ) for ( n in e ) e . hasOwnProperty ( n ) && ( t [ n ] = i ( e [ n ] ) ) ; else for ( n in e ) Da . call ( e , n ) && ( t [ n ] = i ( e [ n ] ) ) ; return r ( t , a ) , t } function i ( e ) { if ( ! y ( e ) ) return e ; var t = s . indexOf ( e ) ; if ( t !== - 1 ) return l [ t ] ; if ( M ( e ) || x ( e ) ) throw Wa ( "cpws" , "Can't copy! Making copies of Window or Scope instances is not supported." ) ; var a = ! 1 , i = o ( e ) ; return void 0 === i && ( i = Ya ( e ) ? [ ] : Object . creat
te ( t , u , "A" , a , i , k , $ ) } if ( s = e . className , y ( s ) && ( s = s . animVal ) , w ( s ) && "" !== s ) for ( ; o = b . exec ( s ) ; ) u = ft ( o [ 2 ] ) , te ( t , u , "C" , a , i ) && ( n [ u ] = Xa ( o [ 3 ] ) ) , s = s . substr ( o . index + o [ 0 ] . length ) ; break ; case ri : if ( 11 === Oa ) for ( ; e . parentNode && e . nextSibling && e . nextSibling . nodeType === ri ; ) e . nodeValue = e . nodeValue + e . nextSibling . nodeValue , e . parentNode . removeChild ( e . nextSibling ) ; le ( t , e . nodeValue ) ; break ; case li : try { o = f . exec ( e . nodeValue ) , o && ( u = ft ( o [ 1 ] ) , te ( t , u , "M" , a , i ) && ( n [ u ] = Xa ( o [ 2 ] ) ) ) } catch ( S ) { } } return t . sort ( oe ) , t } function G ( e , t , n ) { var a = [ ] , i = 0 ; if ( t && e . hasAttribute && e . hasAttribute ( t ) ) { do { if ( ! e ) throw Wi ( "uterdir" , "Unterminated attribute, found '{0}' but no matching '{1}' found." , t , n ) ; e . nodeType == oi && ( e . hasAttribute ( t ) && i ++ , e . hasAttribute ( n ) && i -- ) , a . push ( e ) , e = e . nextSibling } while ( i > 0 ) } else a . push ( e ) ; return Ua ( a ) } function K ( e , t , n ) { return function ( a , i , o , s , r ) { return i = G ( i [ 0 ] , t , n ) , e ( a , i , o , s , r ) } } function Y ( e , t , n , a , i , o ) { var s ; return e ? L ( t , n , a , i , o ) : function ( ) { return s || ( s = L ( t , n , a , i , o ) , t = n = o = null ) , s . apply ( this , arguments ) } } function X ( e , t , n , o , s , r , l , d , u ) { function p ( e , t , n , a ) { e && ( n && ( e = K ( e , n , a ) ) , e . require = g . require , e . directiveName = h , ( S === g || g . $$isolateScope ) && ( e = he ( e , { isolateScope : ! 0 } ) ) , l . push ( e ) ) , t && ( n && ( t = K ( t , n , a ) ) , t . require = g . require , t . directiveName = h , ( S === g || g . $$isolateScope ) && ( t = he ( t , { isolateScope : ! 0 } ) ) , d . push ( t ) ) } function m ( e , o , s , r , u ) { function p ( e , t , n , a ) { var i ; if ( x ( e ) || ( a = n , n = t , t = e , e = void 0 ) , T && ( i = b ) , n || ( n = T ? I . parent ( ) : I ) , ! a ) return u ( e , t , i , n , U ) ; var o = u . $$slots [ a ] ; if ( o ) return o ( e , t , i , n , U ) ; if ( _ ( o ) ) throw Wi ( "noslot" , 'No parent directive that requires a transclusion with slot name "{0}". Element: {1}' , a , Z ( I ) ) } var m , g , h , f , v , b , w , I , A , E ; t === s ? ( A = n , I = n . $$element ) : ( I = Ua ( s ) , A = new F ( I , n ) ) , v = o , S ? f = o . $new ( ! 0 ) : k && ( v = o . $parent ) , u && ( w = p , w . $$boundTransclude = u , w . isSlotFilled = function ( e ) { return ! ! u . $$slots [ e ] } ) , $ && ( b = Q ( I , A , w , $ , f , o , S ) ) , S && ( L . $$addScopeInfo ( I , f , ! 0 , ! ( M && ( M === S || M === S . $$originalDirective ) ) ) , L . $$addScopeClass ( I , ! 0 ) , f . $$isolateBindings = S . $$isolateBindings , E = _e ( o , A , f , f . $$isolateBindings , S ) , E . removeWatches && f . $on ( "$destroy" , E . removeWatches ) ) ; for ( var D in b ) { var P = $ [ D ] , N = b [ D ] , R = P . $$bindings . bindToController ; N . identifier && R ? N . bindingInfo = _e ( v , A , N . instance , R , P ) : N . bindingInfo = { } ; var O = N ( ) ; O !== N . instance && ( N . instance = O , I . data ( "$" + P . name + "Controller" , O ) , N . bindingInfo . removeWatches && N . bindingInfo . removeWatches ( ) , N . bindingInfo = _e ( v , A , N . instance , R , P ) ) } for ( a ( $ , function ( e , t ) { var n = e . require ; e . bindToController && ! Ya ( n ) && y ( n ) && c ( b [ t ] . instance , J ( t , n , I , b ) ) } ) , a ( b , function ( e ) { var t = e . instance ; if ( C ( t . $onChanges ) ) try { t . $onChanges ( e . bindingInfo . initialChanges ) } catch ( n ) { i ( n ) } if ( C ( t . $onInit ) ) try { t . $onInit ( ) } catch ( n ) { i ( n ) } C ( t . $onDestroy ) && v . $on ( "$destroy" , function ( ) { t . $onDestroy ( ) } ) } ) , m = 0 , g = l . length ; m < g ; m ++ ) h = l [ m ] , fe ( h , h . isolateScope ? f : o , I , A , h . require && J ( h . directiveName , h . require , I , b ) , w ) ; var U = o ; for ( S && ( S . template || null === S . templateUrl ) && ( U = f ) , e && e ( U , s . childNodes , void 0 , u ) , m = d . length - 1 ; m >= 0 ; m -- ) h = d [ m ] , fe ( h , h . isolateScope ? f : o , I , A , h . require && J ( h . directiveName , h . require , I , b ) , w ) ; a ( b , function ( e ) { var t = e . instance ; C ( t . $postLink ) && t . $postLink ( ) } ) } u = u || { } ; for ( var g , h , f , v , b , w = - Number . MAX _VALUE , k = u . newScopeDirective , $ = u . controllerDirectives , S = u . newIsolateScopeDirective , M = u . templateDirective , I = u . nonTlbTranscludeDirective , A = ! 1 , E = ! 1 , T = u . hasElementTranscludeDirective , D = n . $$element = Ua ( t ) , P = r , N = o , R = ! 1 , U = ! 1 , B = 0 , j = e . length ; B < j ; B ++ ) { g = e [ B ] ; var V = g . $$start , z = g . $$end ; if ( V && ( D = G ( t , V , z ) ) , f = void 0 , w > g . priority ) break ; if ( ( b = g . scope ) && ( g . templateUrl || ( y ( b ) ? ( se ( "new/isolated scope" , S || k , g , D ) , S = g ) : se ( "new/isolated scope" , S , g , D ) ) , k = k || g ) , h = g . name , ! R && ( g . replace && ( g . templateUrl || g . template ) || g . transclude && ! g . $$tlb ) ) { for ( var X , te = B + 1 ; X = e [ te ++ ] ; ) if ( X . transclude && ! X . $$tlb || X . replace && ( X . templateUrl || X . template ) ) { U = ! 0 ; break } R = ! 0 } if ( ! g . templateUrl && g . controller && ( b = g . controller , $ = $ || ge ( ) , se ( "'" + h + "' controller" , $ [ h ] , g , D ) , $ [ h ] = g ) , b = g . transclude ) if ( A = ! 0 , g . $$tlb || ( se ( "transclusion" , I , g , D ) , I = g ) , "element" == b ) T = ! 0 , w = g . priority , f = D , D = n . $$element = Ua ( L . $$createComment ( h , n [ h ] ) ) , t = D [ 0 ] , me ( s , H ( f ) , t ) , f [ 0 ] . $$parentNode = f [ 0 ] . parentNode , N = Y ( U , f , o , w , P && P . name , { nonTlbTranscludeDirective : I } ) ; else { var ne = ge ( ) ; if ( f = Ua ( Ee ( t ) ) . contents ( ) , y ( b ) ) { f = [ ] ; var oe = ge ( ) , re = g
cn ( e . consequent , t ) , e . constant = e . test . constant && e . alternate . constant && e . consequent . constant , e . toWatch = e . constant ? [ ] : [ e ] ; break ; case vo . Identifier : e . constant = ! 1 , e . toWatch = [ e ] ; break ; case vo . MemberExpression : cn ( e . object , t ) , e . computed && cn ( e . property , t ) , e . constant = e . object . constant && ( ! e . computed || e . property . constant ) , e . toWatch = [ e ] ; break ; case vo . CallExpression : n = ! ! e . filter && ln ( t , e . callee . name ) , i = [ ] , a ( e . arguments , function ( e ) { cn ( e , t ) , n = n && e . constant , e . constant || i . push . apply ( i , e . toWatch ) } ) , e . constant = n , e . toWatch = e . filter && ln ( t , e . callee . name ) ? i : [ e ] ; break ; case vo . AssignmentExpression : cn ( e . left , t ) , cn ( e . right , t ) , e . constant = e . left . constant && e . right . constant , e . toWatch = [ e ] ; break ; case vo . ArrayExpression : n = ! 0 , i = [ ] , a ( e . elements , function ( e ) { cn ( e , t ) , n = n && e . constant , e . constant || i . push . apply ( i , e . toWatch ) } ) , e . constant = n , e . toWatch = i ; break ; case vo . ObjectExpression : n = ! 0 , i = [ ] , a ( e . properties , function ( e ) { cn ( e . value , t ) , n = n && e . value . constant && ! e . computed , e . value . constant || i . push . apply ( i , e . value . toWatch ) } ) , e . constant = n , e . toWatch = i ; break ; case vo . ThisExpression : e . constant = ! 1 , e . toWatch = [ ] ; break ; case vo . LocalsExpression : e . constant = ! 1 , e . toWatch = [ ] } } function dn ( e ) { if ( 1 == e . length ) { var t = e [ 0 ] . expression , n = t . toWatch ; return 1 !== n . length ? n : n [ 0 ] !== t ? n : void 0 } } function un ( e ) { return e . type === vo . Identifier || e . type === vo . MemberExpression } function pn ( e ) { if ( 1 === e . body . length && un ( e . body [ 0 ] . expression ) ) return { type : vo . AssignmentExpression , left : e . body [ 0 ] . expression , right : { type : vo . NGValueParameter } , operator : "=" } } function mn ( e ) { return 0 === e . body . length || 1 === e . body . length && ( e . body [ 0 ] . expression . type === vo . Literal || e . body [ 0 ] . expression . type === vo . ArrayExpression || e . body [ 0 ] . expression . type === vo . ObjectExpression ) } function gn ( e ) { return e . constant } function hn ( e , t ) { this . astBuilder = e , this . $filter = t } function fn ( e , t ) { this . astBuilder = e , this . $filter = t } function _n ( e ) { return "constructor" == e } function vn ( e ) { return C ( e . valueOf ) ? e . valueOf ( ) : bo . call ( e ) } function yn ( ) { var e , t , n = ge ( ) , i = ge ( ) , o = { "true" : ! 0 , "false" : ! 1 , "null" : null , undefined : void 0 } ; this . addLiteral = function ( e , t ) { o [ e ] = t } , this . setIdentifierFns = function ( n , a ) { return e = n , t = a , this } , this . $get = [ "$filter" , function ( s ) { function r ( e , t , a ) { var o , r , c ; switch ( a = a || b , typeof e ) { case "string" : e = e . trim ( ) , c = e ; var f = a ? i : n ; if ( o = f [ c ] , ! o ) { ":" === e . charAt ( 0 ) && ":" === e . charAt ( 1 ) && ( r = ! 0 , e = e . substring ( 2 ) ) ; var v = a ? y : _ , w = new _o ( v ) , k = new yo ( w , s , v ) ; o = k . parse ( e ) , o . constant ? o . $$watchDelegate = g : r ? o . $$watchDelegate = o . literal ? p : u : o . inputs && ( o . $$watchDelegate = d ) , a && ( o = l ( o ) ) , f [ c ] = o } return h ( o , t ) ; case "function" : return h ( e , t ) ; default : return h ( m , t ) } } function l ( e ) { function t ( t , n , a , i ) { var o = b ; b = ! 0 ; try { return e ( t , n , a , i ) } finally { b = o } } if ( ! e ) return e ; t . $$watchDelegate = e . $$watchDelegate , t . assign = l ( e . assign ) , t . constant = e . constant , t . literal = e . literal ; for ( var n = 0 ; e . inputs && n < e . inputs . length ; ++ n ) e . inputs [ n ] = l ( e . inputs [ n ] ) ; return t . inputs = e . inputs , t } function c ( e , t ) { return null == e || null == t ? e === t : ( "object" != typeof e || ( e = vn ( e ) , "object" != typeof e ) ) && ( e === t || e !== e && t !== t ) } function d ( e , t , n , a , i ) { var o , s = a . inputs ; if ( 1 === s . length ) { var r = c ; return s = s [ 0 ] , e . $watch ( function ( e ) { var t = s ( e ) ; return c ( t , r ) || ( o = a ( e , void 0 , void 0 , [ t ] ) , r = t && vn ( t ) ) , o } , t , n , i ) } for ( var l = [ ] , d = [ ] , u = 0 , p = s . length ; u < p ; u ++ ) l [ u ] = c , d [ u ] = null ; return e . $watch ( function ( e ) { for ( var t = ! 1 , n = 0 , i = s . length ; n < i ; n ++ ) { var r = s [ n ] ( e ) ; ( t || ( t = ! c ( r , l [ n ] ) ) ) && ( d [ n ] = r , l [ n ] = r && vn ( r ) ) } return t && ( o = a ( e , void 0 , void 0 , d ) ) , o } , t , n , i ) } function u ( e , t , n , a ) { var i , o ; return i = e . $watch ( function ( e ) { return a ( e ) } , function ( e , n , a ) { o = e , C ( t ) && t . apply ( this , arguments ) , v ( e ) && a . $$postDigest ( function ( ) { v ( o ) && i ( ) } ) } , n ) } function p ( e , t , n , i ) { function o ( e ) { var t = ! 0 ; return a ( e , function ( e ) { v ( e ) || ( t = ! 1 ) } ) , t } var s , r ; return s = e . $watch ( function ( e ) { return i ( e ) } , function ( e , n , a ) { r = e , C ( t ) && t . call ( this , e , n , a ) , o ( e ) && a . $$postDigest ( function ( ) { o ( r ) && s ( ) } ) } , n ) } function g ( e , t , n , a ) { var i ; return i = e . $watch ( function ( e ) { return i ( ) , a ( e ) } , t , n ) } function h ( e , t ) { if ( ! t ) return e ; var n = e . $$watchDelegate , a = ! 1 , i = n !== p && n !== u , o = i ? function ( n , i , o , s ) { var r = a && s ? s [ 0 ] : e ( n , i , o , s ) ; return t ( r , n , i ) } : function ( n , a , i , o ) { var s = e ( n , a , i , o ) , r = t ( s , n , a ) ; return v ( s ) ? r : s } ; return e . $$watchDelegate && e . $$watchDelegate !== d ? o . $$watchDelegate = e . $$watchDe
return u ( e ) ? ( m = e , m && g && ( m = Y ( m , g , ! 0 ) ) , d ( "date" ) ( e , a , g ) ) : ( m = null , "" ) } ) , v ( s . min ) || s . ngMin ) { var h ; r . $validators . min = function ( e ) { return ! u ( e ) || _ ( h ) || n ( e ) >= h } , s . $observe ( "min" , function ( e ) { h = p ( e ) , r . $validate ( ) } ) } if ( v ( s . max ) || s . ngMax ) { var f ; r . $validators . max = function ( e ) { return ! u ( e ) || _ ( f ) || n ( e ) <= f } , s . $observe ( "max" , function ( e ) { f = p ( e ) , r . $validate ( ) } ) } } } function ya ( e , t , n , a ) { var i = t [ 0 ] , o = a . $$hasNativeValidators = y ( i . validity ) ; o && a . $parsers . push ( function ( e ) { var n = t . prop ( Ta ) || { } ; return n . badInput || n . typeMismatch ? void 0 : e } ) } function ba ( e , t , n , a , i , o ) { if ( ya ( e , t , n , a ) , ha ( e , t , n , a , i , o ) , a . $$parserName = "number" , a . $parsers . push ( function ( e ) { return a . $isEmpty ( e ) ? null : Vo . test ( e ) ? parseFloat ( e ) : void 0 } ) , a . $formatters . push ( function ( e ) { if ( ! a . $isEmpty ( e ) ) { if ( ! k ( e ) ) throw xs ( "numfmt" , "Expected `{0}` to be a number" , e ) ; e = e . toString ( ) } return e } ) , v ( n . min ) || n . ngMin ) { var s ; a . $validators . min = function ( e ) { return a . $isEmpty ( e ) || _ ( s ) || e >= s } , n . $observe ( "min" , function ( e ) { v ( e ) && ! k ( e ) && ( e = parseFloat ( e , 10 ) ) , s = k ( e ) && ! isNaN ( e ) ? e : void 0 , a . $validate ( ) } ) } if ( v ( n . max ) || n . ngMax ) { var r ; a . $validators . max = function ( e ) { return a . $isEmpty ( e ) || _ ( r ) || e <= r } , n . $observe ( "max" , function ( e ) { v ( e ) && ! k ( e ) && ( e = parseFloat ( e , 10 ) ) , r = k ( e ) && ! isNaN ( e ) ? e : void 0 , a . $validate ( ) } ) } } function wa ( e , t , n , a , i , o ) { ha ( e , t , n , a , i , o ) , ma ( a ) , a . $$parserName = "url" , a . $validators . url = function ( e , t ) { var n = e || t ; return a . $isEmpty ( n ) || Ho . test ( n ) } } function ka ( e , t , n , a , i , o ) { ha ( e , t , n , a , i , o ) , ma ( a ) , a . $$parserName = "email" , a . $validators . email = function ( e , t ) { var n = e || t ; return a . $isEmpty ( n ) || qo . test ( n ) } } function $a ( e , t , n , a ) { _ ( n . name ) && t . attr ( "name" , s ( ) ) ; var i = function ( e ) { t [ 0 ] . checked && a . $setViewValue ( n . value , e && e . type ) } ; t . on ( "click" , i ) , a . $render = function ( ) { var e = n . value ; t [ 0 ] . checked = e == a . $viewValue } , n . $observe ( "value" , a . $render ) } function Ca ( e , t , n , a , i ) { var o ; if ( v ( a ) ) { if ( o = e ( a ) , ! o . constant ) throw xs ( "constexpr" , "Expected constant expression for `{0}`, but saw `{1}`." , n , a ) ; return o ( t ) } return i } function Sa ( e , t , n , a , i , o , s , r ) { var l = Ca ( r , e , "ngTrueValue" , n . ngTrueValue , ! 0 ) , c = Ca ( r , e , "ngFalseValue" , n . ngFalseValue , ! 1 ) , d = function ( e ) { a . $setViewValue ( t [ 0 ] . checked , e && e . type ) } ; t . on ( "click" , d ) , a . $render = function ( ) { t [ 0 ] . checked = a . $viewValue } , a . $isEmpty = function ( e ) { return e === ! 1 } , a . $formatters . push ( function ( e ) { return B ( e , l ) } ) , a . $parsers . push ( function ( e ) { return e ? l : c } ) } function Ma ( e , t ) { return e = "ngClass" + e , [ "$animate" , function ( n ) { function i ( e , t ) { var n = [ ] ; e : for ( var a = 0 ; a < e . length ; a ++ ) { for ( var i = e [ a ] , o = 0 ; o < t . length ; o ++ ) if ( i == t [ o ] ) continue e ; n . push ( i ) } return n } function o ( e ) { var t = [ ] ; return Ya ( e ) ? ( a ( e , function ( e ) { t = t . concat ( o ( e ) ) } ) , t ) : w ( e ) ? e . split ( " " ) : y ( e ) ? ( a ( e , function ( e , n ) { e && ( t = t . concat ( n . split ( " " ) ) ) } ) , t ) : e } return { restrict : "AC" , link : function ( s , r , l ) { function c ( e ) { var t = u ( e , 1 ) ; l . $addClass ( t ) } function d ( e ) { var t = u ( e , - 1 ) ; l . $removeClass ( t ) } function u ( e , t ) { var n = r . data ( "$classCounts" ) || ge ( ) , i = [ ] ; return a ( e , function ( e ) { ( t > 0 || n [ e ] ) && ( n [ e ] = ( n [ e ] || 0 ) + t , n [ e ] === + ( t > 0 ) && i . push ( e ) ) } ) , r . data ( "$classCounts" , n ) , i . join ( " " ) } function p ( e , t ) { var a = i ( t , e ) , o = i ( e , t ) ; a = u ( a , 1 ) , o = u ( o , - 1 ) , a && a . length && n . addClass ( r , a ) , o && o . length && n . removeClass ( r , o ) } function m ( e ) { if ( t === ! 0 || ( 1 & s . $index ) === t ) { var n = o ( e || [ ] ) ; if ( g ) { if ( ! B ( e , g ) ) { var a = o ( g ) ; p ( a , n ) } } else c ( n ) } g = Ya ( e ) ? e . map ( function ( e ) { return fe ( e ) } ) : fe ( e ) } var g ; s . $watch ( l [ e ] , m , ! 0 ) , l . $observe ( "class" , function ( t ) { m ( s . $eval ( l [ e ] ) ) } ) , "ngClass" !== e && s . $watch ( "$index" , function ( n , a ) { var i = 1 & n ; if ( i !== ( 1 & a ) ) { var r = o ( s . $eval ( l [ e ] ) ) ; i === t ? c ( r ) : d ( r ) } } ) } } } ] } function xa ( e ) { function t ( e , t , r ) { _ ( t ) ? n ( "$pending" , e , r ) : a ( "$pending" , e , r ) , T ( t ) ? t ? ( d ( s . $error , e , r ) , c ( s . $$success , e , r ) ) : ( c ( s . $error , e , r ) , d ( s . $$success , e , r ) ) : ( d ( s . $error , e , r ) , d ( s . $$success , e , r ) ) , s . $pending ? ( i ( Cs , ! 0 ) , s . $valid = s . $invalid = void 0 , o ( "" , null ) ) : ( i ( Cs , ! 1 ) , s . $valid = Ia ( s . $error ) , s . $invalid = ! s . $valid , o ( "" , s . $valid ) ) ; var l ; l = s . $pending && s . $pending [ e ] ? void 0 : ! s . $error [ e ] && ( ! ! s . $$success [ e ] || null ) , o ( e , l ) , s . $$parentForm . $setValidity ( e , l , s ) } function n ( e , t , n ) { s [ e ] || ( s [ e ] = { } ) , c ( s [ e ] , t , n ) } function a ( e , t , n ) { s [ e ] && d ( s [ e ] , t , n ) , Ia ( s [ e ] ) && ( s [ e ] = void 0 ) } function i ( e , t ) { t && ! l [ e ] ? ( u . addClass ( r , e ) , l [ e ] = ! 0 ) : ! t && l [ e ] && ( u . removeClass ( r , e ) , l [ e ] = ! 1 ) } function o ( e , t ) { e = e ? "-" + re ( e , "-" ) : "" , i ( vs + e , t === ! 0 ) , i ( ys + e , t === ! 1 ) } var s = e . ct
( p . state . expensiveChecks || _n ( e . name ) ) && p . addEnsureSafeObject ( t ) , i ( t ) ; break ; case vo . MemberExpression : r = n && ( n . context = this . nextId ( ) ) || this . nextId ( ) , t = t || this . nextId ( ) , p . recurse ( e . object , r , void 0 , function ( ) { p . if _ ( p . notNull ( r ) , function ( ) { o && 1 !== o && p . addEnsureSafeAssignContext ( r ) , e . computed ? ( l = p . nextId ( ) , p . recurse ( e . property , l ) , p . getStringValue ( l ) , p . addEnsureSafeMemberName ( l ) , o && 1 !== o && p . if _ ( p . not ( p . computedMember ( r , l ) ) , p . lazyAssign ( p . computedMember ( r , l ) , "{}" ) ) , d = p . ensureSafeObject ( p . computedMember ( r , l ) ) , p . assign ( t , d ) , n && ( n . computed = ! 0 , n . name = l ) ) : ( en ( e . property . name ) , o && 1 !== o && p . if _ ( p . not ( p . nonComputedMember ( r , e . property . name ) ) , p . lazyAssign ( p . nonComputedMember ( r , e . property . name ) , "{}" ) ) , d = p . nonComputedMember ( r , e . property . name ) , ( p . state . expensiveChecks || _n ( e . property . name ) ) && ( d = p . ensureSafeObject ( d ) ) , p . assign ( t , d ) , n && ( n . computed = ! 1 , n . name = e . property . name ) ) } , function ( ) { p . assign ( t , "undefined" ) } ) , i ( t ) } , ! ! o ) ; break ; case vo . CallExpression : t = t || this . nextId ( ) , e . filter ? ( l = p . filter ( e . callee . name ) , c = [ ] , a ( e . arguments , function ( e ) { var t = p . nextId ( ) ; p . recurse ( e , t ) , c . push ( t ) } ) , d = l + "(" + c . join ( "," ) + ")" , p . assign ( t , d ) , i ( t ) ) : ( l = p . nextId ( ) , r = { } , c = [ ] , p . recurse ( e . callee , l , r , function ( ) { p . if _ ( p . notNull ( l ) , function ( ) { p . addEnsureSafeFunction ( l ) , a ( e . arguments , function ( e ) { p . recurse ( e , p . nextId ( ) , void 0 , function ( e ) { c . push ( p . ensureSafeObject ( e ) ) } ) } ) , r . name ? ( p . state . expensiveChecks || p . addEnsureSafeObject ( r . context ) , d = p . member ( r . context , r . name , r . computed ) + "(" + c . join ( "," ) + ")" ) : d = l + "(" + c . join ( "," ) + ")" , d = p . ensureSafeObject ( d ) , p . assign ( t , d ) } , function ( ) { p . assign ( t , "undefined" ) } ) , i ( t ) } ) ) ; break ; case vo . AssignmentExpression : if ( l = this . nextId ( ) , r = { } , ! un ( e . left ) ) throw uo ( "lval" , "Trying to assign a value to a non l-value" ) ; this . recurse ( e . left , void 0 , r , function ( ) { p . if _ ( p . notNull ( r . context ) , function ( ) { p . recurse ( e . right , l ) , p . addEnsureSafeObject ( p . member ( r . context , r . name , r . computed ) ) , p . addEnsureSafeAssignContext ( r . context ) , d = p . member ( r . context , r . name , r . computed ) + e . operator + l , p . assign ( t , d ) , i ( t || d ) } ) } , 1 ) ; break ; case vo . ArrayExpression : c = [ ] , a ( e . elements , function ( e ) { p . recurse ( e , p . nextId ( ) , void 0 , function ( e ) { c . push ( e ) } ) } ) , d = "[" + c . join ( "," ) + "]" , this . assign ( t , d ) , i ( d ) ; break ; case vo . ObjectExpression : c = [ ] , u = ! 1 , a ( e . properties , function ( e ) { e . computed && ( u = ! 0 ) } ) , u ? ( t = t || this . nextId ( ) , this . assign ( t , "{}" ) , a ( e . properties , function ( e ) { e . computed ? ( r = p . nextId ( ) , p . recurse ( e . key , r ) ) : r = e . key . type === vo . Identifier ? e . key . name : "" + e . key . value , l = p . nextId ( ) , p . recurse ( e . value , l ) , p . assign ( p . member ( t , r , e . computed ) , l ) } ) ) : ( a ( e . properties , function ( t ) { p . recurse ( t . value , e . constant ? void 0 : p . nextId ( ) , void 0 , function ( e ) { c . push ( p . escape ( t . key . type === vo . Identifier ? t . key . name : "" + t . key . value ) + ":" + e ) } ) } ) , d = "{" + c . join ( "," ) + "}" , this . assign ( t , d ) ) , i ( t || d ) ; break ; case vo . ThisExpression : this . assign ( t , "s" ) , i ( "s" ) ; break ; case vo . LocalsExpression : this . assign ( t , "l" ) , i ( "l" ) ; break ; case vo . NGValueParameter : this . assign ( t , "v" ) , i ( "v" ) } } , getHasOwnProperty : function ( e , t ) { var n = e + "." + t , a = this . current ( ) . own ; return a . hasOwnProperty ( n ) || ( a [ n ] = this . nextId ( ! 1 , e + "&&(" + this . escape ( t ) + " in " + e + ")" ) ) , a [ n ] } , assign : function ( e , t ) { if ( e ) return this . current ( ) . body . push ( e , "=" , t , ";" ) , e } , filter : function ( e ) { return this . state . filters . hasOwnProperty ( e ) || ( this . state . filters [ e ] = this . nextId ( ! 0 ) ) , this . state . filters [ e ] } , ifDefined : function ( e , t ) { return "ifDefined(" + e + "," + this . escape ( t ) + ")" } , plus : function ( e , t ) { return "plus(" + e + "," + t + ")" } , return _ : function ( e ) { this . current ( ) . body . push ( "return " , e , ";" ) } , if _ : function ( e , t , n ) { if ( e === ! 0 ) t ( ) ; else { var a = this . current ( ) . body ; a . push ( "if(" , e , "){" ) , t ( ) , a . push ( "}" ) , n && ( a . push ( "else{" ) , n ( ) , a . push ( "}" ) ) } } , not : function ( e ) { return "!(" + e + ")" } , notNull : function ( e ) { return e + "!=null" } , nonComputedMember : function ( e , t ) { var n = /[$_a-zA-Z][$_a-zA-Z0-9]*/ , a = /[^$_a-zA-Z0-9]/g ; return n . test ( t ) ? e + "." + t : e + '["' + t . replace ( a , this . stringEscapeFn ) + '"]' } , computedMember : function ( e , t ) { return e + "[" + t + "]" } , member : function ( e , t , n ) { return n ? this . computedMember ( e , t ) : this . nonComputedMember ( e , t ) } , addEnsureSafeObject : function ( e ) { this . current ( ) . body . push ( this . ensureSafeObject ( e ) , ";" ) } , addEnsureSafeMemberName : function ( e ) { this . current ( ) . body . push ( this . ensureSafeMemberName ( e ) , ";" ) } , ad
T [ u ] = { id : x , scope : void 0 , clone : void 0 } , F [ x ] = ! 0 } for ( var R in h ) { if ( E = h [ R ] , D = me ( E . clone ) , i . leave ( D ) , D [ 0 ] . parentNode ) for ( u = 0 , f = D . length ; u < f ; u ++ ) D [ u ] [ s ] = ! 0 ; E . scope . $destroy ( ) } for ( u = 0 ; u < w ; u ++ ) if ( S = o === A ? u : A [ u ] , M = o [ S ] , E = T [ u ] , E . scope ) { v = P ; do v = v . nextSibling ; while ( v && v [ s ] ) ; c ( E ) != v && i . move ( me ( E . clone ) , null , P ) , P = d ( E ) , l ( E . scope , u , y , M , b , S , w ) } else g ( function ( e , t ) { E . scope = t ; var n = m . cloneNode ( ! 1 ) ; e [ e . length ++ ] = n , i . enter ( e , null , P ) , P = n , E . clone = e , F [ E . id ] = E , l ( E . scope , u , y , M , b , S , w ) } ) ; h = F } ) } } } } ] , Us = "ng-hide" , Ls = "ng-hide-animate" , Bs = [ "$animate" , function ( e ) { return { restrict : "A" , multiElement : ! 0 , link : function ( t , n , a ) { t . $watch ( a . ngShow , function ( t ) { e [ t ? "removeClass" : "addClass" ] ( n , Us , { tempClasses : Ls } ) } ) } } } ] , js = [ "$animate" , function ( e ) { return { restrict : "A" , multiElement : ! 0 , link : function ( t , n , a ) { t . $watch ( a . ngHide , function ( t ) { e [ t ? "addClass" : "removeClass" ] ( n , Us , { tempClasses : Ls } ) } ) } } } ] , Hs = da ( function ( e , t , n ) { e . $watch ( n . ngStyle , function ( e , n ) { n && e !== n && a ( n , function ( e , n ) { t . css ( n , "" ) } ) , e && t . css ( e ) } , ! 0 ) } ) , qs = [ "$animate" , "$compile" , function ( e , t ) { return { require : "ngSwitch" , controller : [ "$scope" , function ( ) { this . cases = { } } ] , link : function ( n , i , o , s ) { var r = o . ngSwitch || o . on , l = [ ] , c = [ ] , d = [ ] , u = [ ] , p = function ( e , t ) { return function ( ) { e . splice ( t , 1 ) } } ; n . $watch ( r , function ( n ) { var i , o ; for ( i = 0 , o = d . length ; i < o ; ++ i ) e . cancel ( d [ i ] ) ; for ( d . length = 0 , i = 0 , o = u . length ; i < o ; ++ i ) { var r = me ( c [ i ] . clone ) ; u [ i ] . $destroy ( ) ; var m = d [ i ] = e . leave ( r ) ; m . then ( p ( d , i ) ) } c . length = 0 , u . length = 0 , ( l = s . cases [ "!" + n ] || s . cases [ "?" ] ) && a ( l , function ( n ) { n . transclude ( function ( a , i ) { u . push ( i ) ; var o = n . element ; a [ a . length ++ ] = t . $$createComment ( "end ngSwitchWhen" ) ; var s = { clone : a } ; c . push ( s ) , e . enter ( a , o . parent ( ) , o ) } ) } ) } ) } } } ] , Vs = da ( { transclude : "element" , priority : 1200 , require : "^ngSwitch" , multiElement : ! 0 , link : function ( e , t , n , a , i ) { a . cases [ "!" + n . ngSwitchWhen ] = a . cases [ "!" + n . ngSwitchWhen ] || [ ] , a . cases [ "!" + n . ngSwitchWhen ] . push ( { transclude : i , element : t } ) } } ) , zs = da ( { transclude : "element" , priority : 1200 , require : "^ngSwitch" , multiElement : ! 0 , link : function ( e , t , n , a , i ) { a . cases [ "?" ] = a . cases [ "?" ] || [ ] , a . cases [ "?" ] . push ( { transclude : i , element : t } ) } } ) , Ws = t ( "ngTransclude" ) , Gs = da ( { restrict : "EAC" , link : function ( e , t , n , a , i ) { function o ( e ) { e . length && ( t . empty ( ) , t . append ( e ) ) } if ( n . ngTransclude === n . $attr . ngTransclude && ( n . ngTransclude = "" ) , ! i ) throw Ws ( "orphan" , "Illegal use of ngTransclude directive in the template! No parent directive that requires a transclusion found. Element: {0}" , Z ( t ) ) ; var s = n . ngTransclude || n . ngTranscludeSlot ; i ( o , null , s ) } } ) , Ks = [ "$templateCache" , function ( e ) { return { restrict : "E" , terminal : ! 0 , compile : function ( t , n ) { if ( "text/ng-template" == n . type ) { var a = n . id , i = t [ 0 ] . text ; e . put ( a , i ) } } } } ] , Ys = { $setViewValue : m , $render : m } , Zs = [ "$element" , "$scope" , function ( t , n ) { var a = this , i = new Je ; a . ngModelCtrl = Ys , a . unknownOption = Ua ( e . document . createElement ( "option" ) ) , a . renderUnknownOption = function ( e ) { var n = "? " + Xe ( e ) + " ?" ; a . unknownOption . val ( n ) , t . prepend ( a . unknownOption ) , t . val ( n ) } , n . $on ( "$destroy" , function ( ) { a . renderUnknownOption = m } ) , a . removeUnknownOption = function ( ) { a . unknownOption . parent ( ) && a . unknownOption . remove ( ) } , a . readValue = function ( ) { return a . removeUnknownOption ( ) , t . val ( ) } , a . writeValue = function ( e ) { a . hasOption ( e ) ? ( a . removeUnknownOption ( ) , t . val ( e ) , "" === e && a . emptyOption . prop ( "selected" , ! 0 ) ) : null == e && a . emptyOption ? ( a . removeUnknownOption ( ) , t . val ( "" ) ) : a . renderUnknownOption ( e ) } , a . addOption = function ( e , t ) { if ( t [ 0 ] . nodeType !== li ) { ue ( e , '"option value"' ) , "" === e && ( a . emptyOption = t ) ; var n = i . get ( e ) || 0 ; i . put ( e , n + 1 ) , a . ngModelCtrl . $render ( ) , Aa ( t ) } } , a . removeOption = function ( e ) { var t = i . get ( e ) ; t && ( 1 === t ? ( i . remove ( e ) , "" === e && ( a . emptyOption = void 0 ) ) : i . put ( e , t - 1 ) ) } , a . hasOption = function ( e ) { return ! ! i . get ( e ) } , a . registerOption = function ( e , t , n , i , o ) { if ( i ) { var s ; n . $observe ( "value" , function ( e ) { v ( s ) && a . removeOption ( s ) , s = e , a . addOption ( e , t ) } ) } else o ? e . $watch ( o , function ( e , i ) { n . $set ( "value" , e ) , i !== e && a . removeOption ( i ) , a . addOption ( e , t ) } ) : a . addOption ( n . value , t ) ; t . on ( "$destroy" , function ( ) { a . removeOption ( n . value ) , a . ngModelCtrl . $render ( ) } ) } } ] , Xs = function ( ) { function e ( e , t , n , i ) { var o = i [ 1 ] ; if ( o ) { var s = i [ 0 ] ; if ( s . ngModelCtrl = o , t . on ( "change" , function ( ) { e . $apply ( function ( ) { o . $setViewValue ( s . readValue ( ) ) } ) } ) , n . multiple ) { s . readValue = function ( ) { var
L . runner ; L . close ( ) } else { var Y = s ( "join" , e , z , L ) ; if ( Y ) { if ( L . state !== g ) return y ( e , E ? t : null , w ) , t = z . event = L . event , w = f ( e , L , z ) , L . runner ; I ( e , z ) } } } else I ( e , z ) ; var J = z . structural ; if ( J || ( J = "animate" === z . event && Object . keys ( z . options . to || { } ) . length > 0 || c ( z ) ) , ! J ) return l ( ) , F ( e ) , C ; var Q = ( L . counter || 0 ) + 1 ; return z . counter = Q , O ( e , d , z ) , o . $$postDigest ( function ( ) { var n = G . get ( u ) , i = ! n ; n = n || { } ; var o = e . parent ( ) || [ ] , s = o . length > 0 && ( "animate" === n . event || n . structural || c ( n ) ) ; if ( i || n . counter !== Q || ! s ) return i && ( ae ( e , w ) , m ( e , w ) ) , ( i || E && n . event !== t ) && ( w . domOperation ( ) , C . end ( ) ) , void ( s || F ( e ) ) ; t = ! n . structural && c ( n , ! 0 ) ? "setClass" : n . event , O ( e , g ) ; var r = k ( e , t , n . options ) ; C . setHost ( r ) , a ( C , t , "start" , { } ) , r . done ( function ( n ) { l ( ! n ) ; var i = G . get ( u ) ; i && i . counter === Q && F ( v ( e ) ) , a ( C , t , "close" , { } ) } ) } ) , C } function P ( e ) { var t = v ( e ) , n = t . querySelectorAll ( "[" + Ie + "]" ) ; j ( n , function ( e ) { var t = parseInt ( e . getAttribute ( Ie ) ) , n = G . get ( e ) ; if ( n ) switch ( t ) { case g : n . runner . end ( ) ; case d : G . remove ( e ) } } ) } function F ( e ) { var t = v ( e ) ; t . removeAttribute ( Ie ) , G . remove ( t ) } function N ( e , t ) { return v ( e ) === v ( t ) } function R ( e , t , n ) { var a , i = B ( _ [ 0 ] . body ) , o = N ( e , i ) || "HTML" === e [ 0 ] . nodeName , s = N ( e , h ) , r = ! 1 , l = Z . get ( v ( e ) ) , c = B . data ( e [ 0 ] , Ae ) ; for ( c && ( t = c ) , t = v ( t ) ; t && ( s || ( s = N ( t , h ) ) , t . nodeType === Y ) ; ) { var d = G . get ( t ) || { } ; if ( ! r ) { var u = Z . get ( t ) ; if ( u === ! 0 && l !== ! 1 ) { l = ! 0 ; break } u === ! 1 && ( l = ! 1 ) , r = d . structural } if ( z ( a ) || a === ! 0 ) { var p = B . data ( t , ne ) ; W ( p ) && ( a = p ) } if ( r && a === ! 1 ) break ; if ( o || ( o = N ( t , i ) ) , o && s ) break ; t = s || ! ( c = B . data ( t , Ae ) ) ? t . parentNode : v ( c ) } var m = ( ! r || a ) && l !== ! 0 ; return m && s && o } function O ( e , t , n ) { n = n || { } , n . state = t ; var a = v ( e ) ; a . setAttribute ( Ie , t ) ; var i = G . get ( a ) , o = i ? L ( i , n ) : n ; G . put ( a , o ) } var G = new w , Z = new w , X = null , J = o . $watch ( function ( ) { return 0 === C . totalPendingRequests } , function ( e ) { e && ( J ( ) , o . $$postDigest ( function ( ) { o . $$postDigest ( function ( ) { null === X && ( X = ! 0 ) } ) } ) ) } ) , Q = { } , ee = a . classNameFilter ( ) , te = ee ? function ( e ) { return ee . test ( e ) } : function ( ) { return ! 0 } , ae = u ( S ) , ie = e . Node . prototype . contains || function ( e ) { return this === e || ! ! ( 16 & this . compareDocumentPosition ( e ) ) } , oe = { on : function ( e , t , n ) { var a = l ( t ) ; Q [ e ] = Q [ e ] || [ ] , Q [ e ] . push ( { node : a , callback : n } ) , B ( t ) . on ( "$destroy" , function ( ) { var i = G . get ( a ) ; i || oe . off ( e , t , n ) } ) } , off : function ( e , n , a ) { if ( 1 !== arguments . length || t . isString ( arguments [ 0 ] ) ) { var i = Q [ e ] ; i && ( Q [ e ] = 1 === arguments . length ? null : E ( i , n , a ) ) } else { n = arguments [ 0 ] ; for ( var o in Q ) Q [ o ] = E ( Q [ o ] , n ) } } , pin : function ( e , t ) { n ( K ( e ) , "element" , "not an element" ) , n ( K ( t ) , "parentElement" , "not an element" ) , e . data ( Ae , t ) } , push : function ( e , t , n , a ) { return n = n || { } , n . domOperation = a , D ( e , t , n ) } , enabled : function ( e , t ) { var n = arguments . length ; if ( 0 === n ) t = ! ! X ; else { var a = K ( e ) ; if ( a ) { var i = v ( e ) , o = Z . get ( i ) ; 1 === n ? t = ! o : Z . put ( i , ! t ) } else t = X = ! ! e } return t } } ; return oe } ] } ] , Te = [ "$animateProvider" , function ( e ) { function t ( e , t ) { e . data ( r , t ) } function n ( e ) { e . removeData ( r ) } function i ( e ) { return e . data ( r ) } var o = "ng-animate-ref" , s = this . drivers = [ ] , r = "$$animationRunner" ; this . $get = [ "$$jqLite" , "$rootScope" , "$injector" , "$$AnimateRunner" , "$$HashMap" , "$$rAFScheduler" , function ( e , r , l , c , d , g ) { function h ( e ) { function t ( e ) { if ( e . processed ) return e ; e . processed = ! 0 ; var n = e . domNode , a = n . parentNode ; o . put ( n , e ) ; for ( var s ; a ; ) { if ( s = o . get ( a ) ) { s . processed || ( s = t ( s ) ) ; break } a = a . parentNode } return ( s || i ) . children . push ( e ) , e } function n ( e ) { var t , n = [ ] , a = [ ] ; for ( t = 0 ; t < e . children . length ; t ++ ) a . push ( e . children [ t ] ) ; var i = a . length , o = 0 , s = [ ] ; for ( t = 0 ; t < a . length ; t ++ ) { var r = a [ t ] ; i <= 0 && ( i = o , o = 0 , n . push ( s ) , s = [ ] ) , s . push ( r . fn ) , r . children . forEach ( function ( e ) { o ++ , a . push ( e ) } ) , i -- } return s . length && n . push ( s ) , n } var a , i = { children : [ ] } , o = new d ; for ( a = 0 ; a < e . length ; a ++ ) { var s = e [ a ] ; o . put ( s . domNode , e [ a ] = { domNode : s . domNode , fn : s . fn , children : [ ] } ) } for ( a = 0 ; a < e . length ; a ++ ) t ( e [ a ] ) ; return n ( i ) } var f = [ ] , _ = u ( e ) ; return function ( d , u , y ) { function b ( e ) { var t = "[" + o + "]" , n = e . hasAttribute ( o ) ? [ e ] : e . querySelectorAll ( t ) , a = [ ] ; return j ( n , function ( e ) { var t = e . getAttribute ( o ) ; t && t . length && a . push ( e ) } ) , a } function w ( e ) { var t = [ ] , n = { } ; j ( e , function ( e , a ) { var i = e . element , s = v ( i ) , r = e . event , l = [ "enter" , "move" ] . indexOf ( r ) >= 0 , c = e . structural ? b ( s ) : [ ] ; if ( c . length ) { var d = l ? "to" : "from" ; j ( c , function ( e ) { var t = e . getAttribute ( o ) ; n [ t ] = n [ t ] || { } , n [ t ] [ d ] = { animationID : a , element : B ( e ) } } ) } else t . push ( e ) } ) ; var a = { } , i = { } ; return j ( n , function ( n , o ) { var s = n . from , r
this . $domEl . load ( ) , this . ended = void 0 , t && this . $element . one ( "canplay" , this . play . bind ( this ) ) } , reset : function ( e ) { angular . extend ( this , i ) , this . $clearSourceList ( ) , this . load ( this . $playlist , e ) } , play : function ( e , t ) { return "boolean" == typeof e && ( t = e , e = void 0 ) , t && ( this . $selective = ! 0 ) , this . $playlist . length > e ? ( this . currentTrack = e + 1 , this . load ( this . $playlist [ e ] , ! 0 ) ) : ( ! this . currentTrack && this . $domEl . readyState && this . currentTrack ++ , void ( this . ended ? this . load ( ! 0 ) : this . $domEl . play ( ) ) ) } , playPause : function ( e , t ) { "boolean" == typeof e && ( t = e , e = void 0 ) , t && ( this . $selective = ! 0 ) , "number" == typeof e && e + 1 !== this . currentTrack ? this . play ( e ) : this . playing ? this . pause ( ) : this . play ( ) } , pause : function ( ) { this . $domEl . pause ( ) } , stop : function ( ) { this . reset ( ) } , toggleMute : function ( ) { this . muted = this . $domEl . muted = ! this . $domEl . muted } , next : function ( e ) { var t = this ; if ( t . currentTrack && t . currentTrack < t . tracks ) { var a = e || t . playing ; t . pause ( ) , n ( function ( ) { t . $clearSourceList ( ) , t . $addSourceList ( t . $playlist [ t . currentTrack ] ) , t . load ( a ) , t . currentTrack ++ } ) } } , prev : function ( e ) { var t = this ; if ( t . currentTrack && t . currentTrack - 1 ) { var a = e || t . playing ; t . pause ( ) , n ( function ( ) { t . $clearSourceList ( ) , t . $addSourceList ( t . $playlist [ t . currentTrack - 2 ] ) , t . load ( a ) , t . currentTrack -- } ) } } , setPlaybackRate : function ( e ) { this . $domEl . playbackRate = e } , setVolume : function ( e ) { this . $domEl . volume = e } , seek : function ( e ) { var t , n = 0 ; return "string" != typeof e ? this . $domEl . currentTime = e : ( t = e . split ( ":" ) , n += parseInt ( t . pop ( ) , 10 ) , t . length && ( n += 60 * parseInt ( t . pop ( ) , 10 ) ) , t . length && ( n += 3600 * parseInt ( t . pop ( ) , 10 ) ) , isNaN ( n ) ? void 0 : this . $domEl . currentTime = n ) } , on : function ( e , t ) { return this . $element . on ( e , t ) } , off : function ( e , t ) { return this . $element . off ( e , t ) } , one : function ( e , t ) { return this . $element . one ( e , t ) } , $addSourceList : function ( e ) { var t = this ; if ( angular . isArray ( e ) ) angular . forEach ( e , function ( e , n ) { var a = document . createElement ( "SOURCE" ) ; [ "src" , "type" , "media" ] . forEach ( function ( t ) { void 0 !== e [ t ] && a . setAttribute ( t , e [ t ] ) } ) , t . $element . append ( a ) } ) ; else if ( angular . isObject ( e ) ) { var n = document . createElement ( "SOURCE" ) ; [ "src" , "type" , "media" ] . forEach ( function ( t ) { void 0 !== e [ t ] && n . setAttribute ( t , e [ t ] ) } ) , t . $element . append ( n ) } } , $clearSourceList : function ( ) { this . $element . contents ( ) . remove ( ) } , $formatTime : function ( e ) { if ( e === 1 / 0 ) return "∞" ; var t , n = parseInt ( e / 3600 , 10 ) % 24 , a = parseInt ( e / 60 , 10 ) % 60 , i = parseInt ( e % 60 , 10 ) , o = ( a < 10 ? "0" + a : a ) + ":" + ( i < 10 ? "0" + i : i ) ; return t = n > 0 ? ( n < 10 ? "0" + n : n ) + ":" + o : o } , $attachPlaylist : function ( e ) { void 0 === e || null === e ? this . playlist = [ ] : this . $playlist = e } } , r = function ( e , t , n ) { var i = { playing : function ( ) { e . $apply ( function ( e ) { e . playing = ! 0 , e . ended = ! 1 } ) } , pause : function ( ) { e . $apply ( function ( e ) { e . playing = ! 1 } ) } , ended : function ( ) { ! e . $selective && e . currentTrack < e . tracks ? e . next ( ! 0 ) : e . $apply ( function ( e ) { e . ended = ! 0 , e . playing = ! 1 } ) } , timeupdate : a ( 1e3 , ! 1 , function ( ) { e . $apply ( function ( e ) { e . currentTime = t . currentTime , e . formatTime = e . $formatTime ( e . currentTime ) } ) } ) , loadedmetadata : function ( ) { e . $apply ( function ( e ) { e . currentTrack || e . currentTrack ++ , e . duration = t . duration , e . formatDuration = e . $formatTime ( e . duration ) , t . buffered . length && ( e . loadPercent = Math . round ( t . buffered . end ( t . buffered . length - 1 ) / e . duration * 100 ) ) } ) } , progress : function ( ) { e . $domEl . buffered . length && e . $apply ( function ( e ) { e . loadPercent = Math . round ( t . buffered . end ( t . buffered . length - 1 ) / e . duration * 100 ) , e . network = "progress" } ) } , volumechange : function ( ) { e . $apply ( function ( e ) { e . volume = t . volume , e . muted = t . muted } ) } , seeked : function ( ) { e . $apply ( function ( e ) { e . seeking = ! 1 } ) } , seeking : function ( ) { e . $apply ( function ( e ) { e . seeking = ! 0 } ) } , ratechange : function ( ) { e . $apply ( function ( e ) { e . playbackRate = t . playbackRate } ) } , stalled : function ( ) { e . $apply ( function ( e ) { e . network = "stalled" } ) } , suspend : function ( ) { e . $apply ( function ( e ) { e . network = "suspend" } ) } } ; angular . forEach ( i , function ( e , t ) { n . on ( t , e ) } ) } , l = function ( t ) { var n = angular . extend ( e . $new ( ! 0 ) , { $element : t , $domEl : t [ 0 ] , $playlist : void 0 , buffered : t [ 0 ] . buffered , played : t [ 0 ] . played , seekable : t [ 0 ] . seekable } , i , s ) ; return r ( n , t [ 0 ] , t ) , n } ; return { scope : ! 1 , link : function ( e , t , n , a ) { var i = n . playlist , s = n . mediaPlayer || n . playerControl , r = new l ( t ) , c = e [ i ] ; if ( c = void 0 === i ? [ ] : void 0 === e [ i ] ? e [ i ] = [ ] : e [ i ] , void 0 !== s && e . $eval ( s + " = player" , { player : r } ) , "AUDIO" !== t [ 0 ] . tagName && " VIDE
a . prototype . getName = function ( ) { return this . name } , a . prototype . getData = function ( ) { return this . data } , a . prototype . G = function ( ) { return this . H } , t ( "Zlib.GunzipMember" , a ) , t ( "Zlib.GunzipMember.prototype.getName" , a . prototype . getName ) , t ( "Zlib.GunzipMember.prototype.getData" , a . prototype . getData ) , t ( "Zlib.GunzipMember.prototype.getMtime" , a . prototype . G ) ; var v , y = [ ] ; for ( v = 0 ; 288 > v ; v ++ ) switch ( ! 0 ) { case 143 >= v : y . push ( [ v + 48 , 8 ] ) ; break ; case 255 >= v : y . push ( [ v - 144 + 400 , 9 ] ) ; break ; case 279 >= v : y . push ( [ v - 256 + 0 , 7 ] ) ; break ; case 287 >= v : y . push ( [ v - 280 + 192 , 8 ] ) ; break ; default : e ( "invalid literal: " + v ) } var b = function ( ) { function t ( t ) { switch ( ! 0 ) { case 3 === t : return [ 257 , t - 3 , 0 ] ; case 4 === t : return [ 258 , t - 4 , 0 ] ; case 5 === t : return [ 259 , t - 5 , 0 ] ; case 6 === t : return [ 260 , t - 6 , 0 ] ; case 7 === t : return [ 261 , t - 7 , 0 ] ; case 8 === t : return [ 262 , t - 8 , 0 ] ; case 9 === t : return [ 263 , t - 9 , 0 ] ; case 10 === t : return [ 264 , t - 10 , 0 ] ; case 12 >= t : return [ 265 , t - 11 , 1 ] ; case 14 >= t : return [ 266 , t - 13 , 1 ] ; case 16 >= t : return [ 267 , t - 15 , 1 ] ; case 18 >= t : return [ 268 , t - 17 , 1 ] ; case 22 >= t : return [ 269 , t - 19 , 2 ] ; case 26 >= t : return [ 270 , t - 23 , 2 ] ; case 30 >= t : return [ 271 , t - 27 , 2 ] ; case 34 >= t : return [ 272 , t - 31 , 2 ] ; case 42 >= t : return [ 273 , t - 35 , 3 ] ; case 50 >= t : return [ 274 , t - 43 , 3 ] ; case 58 >= t : return [ 275 , t - 51 , 3 ] ; case 66 >= t : return [ 276 , t - 59 , 3 ] ; case 82 >= t : return [ 277 , t - 67 , 4 ] ; case 98 >= t : return [ 278 , t - 83 , 4 ] ; case 114 >= t : return [ 279 , t - 99 , 4 ] ; case 130 >= t : return [ 280 , t - 115 , 4 ] ; case 162 >= t : return [ 281 , t - 131 , 5 ] ; case 194 >= t : return [ 282 , t - 163 , 5 ] ; case 226 >= t : return [ 283 , t - 195 , 5 ] ; case 257 >= t : return [ 284 , t - 227 , 5 ] ; case 258 === t : return [ 285 , t - 258 , 0 ] ; default : e ( "invalid length: " + t ) } } var n , a , i = [ ] ; for ( n = 3 ; 258 >= n ; n ++ ) a = t ( n ) , i [ n ] = a [ 2 ] << 24 | a [ 1 ] << 16 | a [ 0 ] ; return i } ( ) ; p && new Uint32Array ( b ) ; var w = 0 , k = 1 ; o . prototype . g = function ( ) { for ( ; ! this . o ; ) { var t = s ( this , 3 ) ; switch ( 1 & t && ( this . o = ! 0 ) , t >>>= 1 ) { case 0 : var n = this . input , a = this . c , i = this . b , o = this . a , r = d , c = d , u = d , m = i . length , g = d ; switch ( this . d = this . f = 0 , r = n [ a ++ ] , r === d && e ( Error ( "invalid uncompressed block header: LEN (first byte)" ) ) , c = r , r = n [ a ++ ] , r === d && e ( Error ( "invalid uncompressed block header: LEN (second byte)" ) ) , c |= r << 8 , r = n [ a ++ ] , r === d && e ( Error ( "invalid uncompressed block header: NLEN (first byte)" ) ) , u = r , r = n [ a ++ ] , r === d && e ( Error ( "invalid uncompressed block header: NLEN (second byte)" ) ) , u |= r << 8 , c === ~ u && e ( Error ( "invalid uncompressed block header: length verify" ) ) , a + c > n . length && e ( Error ( "input buffer is broken" ) ) , this . k ) { case w : for ( ; o + c > i . length ; ) { if ( g = m - o , c -= g , p ) i . set ( n . subarray ( a , a + g ) , o ) , o += g , a += g ; else for ( ; g -- ; ) i [ o ++ ] = n [ a ++ ] ; this . a = o , i = this . e ( ) , o = this . a } break ; case k : for ( ; o + c > i . length ; ) i = this . e ( { t : 2 } ) ; break ; default : e ( Error ( "invalid inflate mode" ) ) } if ( p ) i . set ( n . subarray ( a , a + c ) , o ) , o += c , a += c ; else for ( ; c -- ; ) i [ o ++ ] = n [ a ++ ] ; this . c = a , this . a = o , this . b = i ; break ; case 1 : this . l ( U , B ) ; break ; case 2 : l ( this ) ; break ; default : e ( Error ( "unknown BTYPE: " + t ) ) } } return this . q ( ) } ; var $ , C , S = [ 16 , 17 , 18 , 0 , 8 , 7 , 9 , 6 , 10 , 5 , 11 , 4 , 12 , 3 , 13 , 2 , 14 , 1 , 15 ] , M = p ? new Uint16Array ( S ) : S , x = [ 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 13 , 15 , 17 , 19 , 23 , 27 , 31 , 35 , 43 , 51 , 59 , 67 , 83 , 99 , 115 , 131 , 163 , 195 , 227 , 258 , 258 , 258 ] , I = p ? new Uint16Array ( x ) : x , A = [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 , 5 , 5 , 5 , 5 , 0 , 0 , 0 ] , E = p ? new Uint8Array ( A ) : A , T = [ 1 , 2 , 3 , 4 , 5 , 7 , 9 , 13 , 17 , 25 , 33 , 49 , 65 , 97 , 129 , 193 , 257 , 385 , 513 , 769 , 1025 , 1537 , 2049 , 3073 , 4097 , 6145 , 8193 , 12289 , 16385 , 24577 ] , D = p ? new Uint16Array ( T ) : T , P = [ 0 , 0 , 0 , 0 , 1 , 1 , 2 , 2 , 3 , 3 , 4 , 4 , 5 , 5 , 6 , 6 , 7 , 7 , 8 , 8 , 9 , 9 , 10 , 10 , 11 , 11 , 12 , 12 , 13 , 13 ] , F = p ? new Uint8Array ( P ) : P , N = new ( p ? Uint8Array : Array ) ( 288 ) ; for ( $ = 0 , C = N . length ; $ < C ; ++ $ ) N [ $ ] = 143 >= $ ? 8 : 255 >= $ ? 9 : 279 >= $ ? 7 : 8 ; var R , O , U = i ( N ) , L = new ( p ? Uint8Array : Array ) ( 30 ) ; for ( R = 0 , O = L . length ; R < O ; ++ R ) L [ R ] = 5 ; var B = i ( L ) ; o . prototype . l = function ( e , t ) { var n = this . b , a = this . a ; this . r = e ; for ( var i , o , l , c , d = n . length - 258 ; 256 !== ( i = r ( this , e ) ) ; ) if ( 256 > i ) a >= d && ( this . a = a , n = this . e ( ) , a = this . a ) , n [ a ++ ] = i ; else for ( o = i - 257 , c = I [ o ] , 0 < E [ o ] && ( c += s ( this , E [ o ] ) ) , i = r ( this , t ) , l = D [ i ] , 0 < F [ i ] && ( l += s ( this , F [ i ] ) ) , a >= d && ( this . a = a , n = this . e ( ) , a = this . a ) ; c -- ; ) n [ a ] = n [ a ++ - l ] ; for ( ; 8 <= this . d ; ) this . d -= 8 , this . c -- ; this . a = a } , o . prototype . C = function ( e , t ) { var n = this . b , a = this . a ; this . r = e ; for ( var i , o , l , c , d = n . length ; 256 !== ( i = r ( this , e ) ) ; ) if ( 256 > i ) a >= d && ( n = this . e ( ) , d = n . length ) , n [ a ++ ] = i ; else for ( o = i - 257 , c = I [ o ] , 0 < E [ o ] && ( c += s ( this , E [ o ] ) ) , i = r ( this , t ) , l = D [ i ] , 0 < F [ i ] && ( l += s ( this , F [ i ] ) ) , a + c > d && ( n = this . e ( ) , d = n . length ) ; c
Te [ 2 * Ue + Oe ] = ( 1 < Qe ) + 0 , Ae [ Ae . length - 1 ] += 16 ; Fe [ Le + Ue ] = Je } Re |= ke ( De , 8 - 2 * Le ) , Ne |= ke ( Te , 8 - 2 * Le ) } $e |= ke ( Pe , 20 ) , Se |= ke ( Fe , 20 ) , Y . X = $e , Ee . X = Se , j . z = Ae , j . Oa = Ne + 0 , j . ja = Ne | Re , Y . Nb = ! j . ja + 0 } B = ! H . Ab } if ( ! B ) { l = ye ( e , "VP8_STATUS_NOT_ENOUGH_DATA" , "Premature end-of-file encountered." + e . i + " " + e . d ) ; break e } var et = e , tt = et . Ea , nt = ga , at = et . Ea , it = ha , ot = et . Ea , st = fa ; if ( 0 < et . i ) { for ( var rt = m , rt = - 1 ; 16 > rt ; ++ rt ) he ( tt , nt + rt * pa - 4 , tt , nt + rt * pa + 12 ) ; for ( rt = - 1 ; 8 > rt ; ++ rt ) he ( at , it + rt * pa - 4 , at , it + rt * pa + 4 ) , he ( ot , st + rt * pa - 4 , ot , st + rt * pa + 4 ) } else { for ( rt = 0 ; 16 > rt ; ++ rt ) tt [ nt + rt * pa - 1 ] = 129 ; for ( rt = 0 ; 8 > rt ; ++ rt ) at [ it + rt * pa - 1 ] = 129 , ot [ st + rt * pa - 1 ] = 129 ; 0 < et . d && ( tt [ nt - 1 - pa ] = at [ it - 1 - pa ] = ot [ st - 1 - pa ] = 129 ) } var lt = et . Xc , ct = 16 * + et . i , dt = et . Sc , ut = 8 * + et . i , pt = et . Vc , mt = 8 * + et . i , gt = et . z , ht = m ; if ( 0 < et . d ) t ( tt , nt - pa , lt , ct , 16 ) , t ( at , it - pa , dt , ut , 8 ) , t ( ot , st - pa , pt , mt , 8 ) ; else if ( 0 == et . i ) { for ( i = 0 ; 21 > i ; ++ i ) tt [ nt - pa - 1 + i ] = 127 ; for ( i = 0 ; 9 > i ; ++ i ) at [ it - pa - 1 + i ] = 127 ; for ( i = 0 ; 9 > i ; ++ i ) ot [ st - pa - 1 + i ] = 127 } if ( et . wa ) { var ft = nt - pa + 16 ; 0 < et . d && ( et . i >= et . Ma - 1 ? tt [ ft + 0 ] = tt [ ft + 1 ] = tt [ ft + 2 ] = tt [ ft + 3 ] = lt [ ct + 15 ] : t ( tt , ft + 0 , lt , ct + 16 , 4 ) ) ; for ( var _t = 0 ; 4 > _t ; ++ _t ) tt [ _t + ft + 4 * pa ] = tt [ _t + ft + 4 * pa ] = tt [ _t + ft + 8 * pa ] = tt [ _t + ft + 12 * pa ] = tt [ _t + ft + 0 ] ; for ( ht = 0 ; 16 > ht ; ht ++ ) { var vt = tt , yt = nt + hi [ ht ] ; li [ et . Eb [ ht ] ] ( vt , yt ) , et . Oa & 1 << ht ? Ua ( gt , 16 * + ht , vt , yt , 0 ) : et . ja & 1 << ht && Ba ( gt , 16 * + ht , vt , yt ) } } else { var bt = ge ( et , et . Eb [ 0 ] ) ; if ( ci [ bt ] ( tt , nt ) , et . ja ) for ( ht = 0 ; 16 > ht ; ht ++ ) vt = tt , yt = nt + hi [ ht ] , et . Oa & 1 << ht ? Ua ( gt , 16 * + ht , vt , yt , 0 ) : et . ja & 1 << ht && Ba ( gt , 16 * + ht , vt , yt ) } if ( bt = ge ( et , et . Tc ) , di [ bt ] ( at , it ) , di [ bt ] ( ot , st ) , 983040 & et . ja ) { var wt = et . z , kt = 256 ; 983040 & et . Oa ? La ( wt , kt , at , it ) : ja ( wt , kt , at , it ) } if ( 15728640 & et . ja ) { var $t = et . z , kt = 320 ; 15728640 & et . Oa ? La ( $t , kt , ot , st ) : ja ( $t , kt , ot , st ) } et . d < et . hb - 1 && ( t ( lt , ct , tt , nt + 15 * pa , 16 ) , t ( dt , ut , at , it + 7 * pa , 8 ) , t ( pt , mt , ot , st + 7 * pa , 8 ) ) ; var Ct = e ; if ( 0 < Ct . A ) { var St = Ct . M [ 1 + Ct . i ] , Mt = Ct . La [ 1 + Ct . i ] . Nb , xt = Ct . Zb [ Ct . Lb ] ; Ct . ga . oc && ( xt += Ct . ga . Lc [ 0 ] , Ct . wa && ( xt += Ct . ga . Gc [ 0 ] ) ) , xt = 0 > xt ? 0 : 63 < xt ? 63 : xt , St . zc = xt , 0 < Ct . ga . kb && ( xt = 4 < Ct . ga . kb ? xt >> 2 : xt >> 1 , xt > 9 - Ct . ga . kb && ( xt = 9 - Ct . ga . kb ) ) , St . yc = 1 > xt ? 1 : xt , St . ab = ( ! Mt || Ct . wa ) + 0 } for ( var It = m , At = 8 * Ct . Ja * Ct . r , Et = Ct . ca , Tt = Ct . da + 16 * Ct . i + 16 * Ct . Ja * Ct . H , Dt = Ct . aa , Pt = Ct . ba + 8 * Ct . i + At , Ft = Ct . ra , Nt = Ct . sa + 8 * Ct . i + At , It = 0 ; 16 > It ; ++ It ) t ( Et , Tt + It * Ct . H , Ct . Ea , + ga + It * pa , 16 ) ; for ( It = 0 ; 8 > It ; ++ It ) t ( Dt , Pt + It * Ct . r , Ct . Ea , + ha + It * pa , 8 ) , t ( Ft , Nt + It * Ct . r , Ct . Ea , + fa + It * pa , 8 ) } var Rt = e , Ot = s , Ut = 1 , Lt = Rt . oa ; if ( Rt . qb ) { var Bt = Rt . rc , Ut = Ut & WebPWorkerSync ( Bt ) ; if ( p ( Bt . a == OK ) , Ut ) { if ( Lt . N = Ot , Lt . ha = Rt . Ja , Lt . d = Rt . d , Lt . W = Rt . W , Lt . W ) { var jt = Lt . M ; Lt . M = Rt . M , Rt . M = jt } WebPWorkerLaunch ( Bt ) , ++ Rt . Ja == Rt . jb && ( Rt . Ja = 0 ) } } else { Lt . d = Rt . d , Lt . W = Rt . W ; t : { var Ht = 1 , qt = Rt . oa , Vt = pi [ Rt . A ] , zt = Vt * Rt . H , Wt = parseInt ( Vt / 2 ) * Rt . r , Gt = 16 * qt . ha * Rt . H , Kt = 8 * qt . ha * Rt . r , Yt = Rt . ca , Zt = Rt . da - zt + Gt , Xt = Rt . aa , Jt = Rt . ba - Wt + Kt , tn = Rt . ra , an = Rt . sa - Wt + Kt , on = 0 == qt . d , rn = ( qt . d >= Rt . hb - 1 ) + 0 , ln = 16 * qt . d , cn = 16 * ( qt . d + 1 ) ; if ( qt . W ) { var dn = Rt , un = h , pn = dn . oa . d ; for ( p ( dn . oa . W ) , un = dn . lb ; un < dn . wb ; ++ un ) { var mn = dn , gn = un , hn = pn , fn = mn . oa , _n = mn . H , vn = fn . M [ 1 + gn ] , yn = mn . ca , bn = mn . da + 16 * fn . ha * _n + 16 * gn , wn = vn . zc , kn = vn . yc , $n = 2 * wn + kn ; if ( 0 != wn ) if ( 1 == mn . A ) 0 < gn && Xa ( yn , bn , _n , $n + 4 ) , vn . ab && Qa ( yn , bn , _n , $n ) , 0 < hn && Za ( yn , bn , _n , $n + 4 ) , vn . ab && Ja ( yn , bn , _n , $n ) ; else { var Cn = mn . r , Sn = mn . aa , Mn = mn . ba + 8 * fn . ha * Cn + 8 * gn , xn = mn . ra , In = mn . sa + 8 * fn . ha * Cn + 8 * gn , An = mn . Ac . fb ? 40 <= wn ? 2 : 15 <= wn ? 1 : 0 : 40 <= wn ? 3 : 20 <= wn ? 2 : 15 <= wn ? 1 : 0 ; 0 < gn && ( qa ( yn , bn , _n , $n + 4 , kn , An ) , za ( Sn , Mn , xn , In , Cn , $n + 4 , kn , An ) ) , vn . ab && ( Ga ( yn , bn , _n , $n , kn , An ) , Ya ( Sn , Mn , xn , In , Cn , $n , kn , An ) ) , 0 < hn && ( Ha ( yn , bn , _n , $n + 4 , kn , An ) , Va ( Sn , Mn , xn , In , Cn , $n + 4 , kn , An ) ) , vn . ab && ( Wa ( yn , bn , _n , $n , kn , An ) , Ka ( Sn , Mn , xn , In , Cn , $n , kn , An ) ) } } } if ( Ot . put ) { if ( on ? ( Ot . y = Rt . ca , Ot . D = Rt . da + Gt , Ot . c = Rt . aa , Ot . B = Rt . ba + Kt , Ot . S = Rt . ra , Ot . C = Rt . sa + Kt ) : ( ln -= Vt , Ot . y = Yt , Ot . D = Zt , Ot . c = Xt , Ot . B = Jt , Ot . S = tn , Ot . C = an ) , rn || ( cn -= Vt ) , cn > Ot . K && ( cn = Ot . K ) , Rt . Ga != g && ln < cn && ( 0 == ln ? ( Ot . p = O ( Rt , ln , cn - ln ) , Ot . q = 0 ) : Ot . q = O ( Rt , ln , cn - ln ) , Ot . p == g ) ) { Ut = ye ( Rt , nn , "Could not decode alpha data." ) ; break t } if ( ln < Ot . k ) { var En = Ot . k - ln , ln = Ot . k ; p ( ! ( 1 & En ) ) , Ot . D += Rt . H * En , Ot . B += Rt . r * ( En >> 1 ) , Ot . C += Rt . r * ( En >> 1 ) , Ot . p != g && ( Ot . q += Ot . width * En ) } ln < cn && ( Ot . D += Ot . t , Ot . B += Ot . t >> 1 , Ot . C += Ot . t >> 1 , Ot . p != g && ( Ot . q += Ot . t ) , Ot . w = ln - Ot . k , Ot . m = Ot . Ka - Ot . t , Ot . h = cn - ln , Ht = Ot . put ( Ot ) ) } qt . ha + 1 == Rt . jb && ! rn && ( t ( Rt . ca , Rt . da - zt , Yt , Zt + 16 * Rt . H , zt ) , t ( Rt . aa , Rt . ba - Wt , Xt , Jt + 8 * Rt . r , Wt ) , t ( Rt . ra , Rt . sa - W
this . WebPGetDecoderVersion = this . Ld = function ( ) { return 512 } ; var ki = [ 0 , 1 , 2 , 3 , 6 , 4 , 5 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 7 , 0 ] , $i = [ [ 173 , 148 , 140 , 0 ] , [ 176 , 155 , 140 , 135 , 0 ] , [ 180 , 157 , 141 , 134 , 130 , 0 ] , [ 254 , 254 , 243 , 230 , 196 , 177 , 153 , 140 , 133 , 130 , 129 , 0 ] ] , Ci = [ 0 , 1 , 4 , 8 , 5 , 2 , 3 , 6 , 9 , 12 , 13 , 10 , 7 , 11 , 14 , 15 ] , Si = u ( [ da , ua ] , "" ) ; c ( 4 , f ) ; var Mi = [ [ 0 , 0 , 0 , 0 ] , [ 1 , 0 , 0 , 0 ] , [ 0 , 1 , 0 , 0 ] , [ 1 , 1 , 0 , 0 ] , [ 0 , 0 , 1 , 0 ] , [ 1 , 0 , 1 , 0 ] , [ 0 , 1 , 1 , 0 ] , [ 1 , 1 , 1 , 0 ] , [ 0 , 0 , 0 , 1 ] , [ 1 , 0 , 0 , 1 ] , [ 0 , 1 , 0 , 1 ] , [ 1 , 1 , 0 , 1 ] , [ 0 , 0 , 1 , 1 ] , [ 1 , 0 , 1 , 1 ] , [ 0 , 1 , 1 , 1 ] , [ 1 , 1 , 1 , 1 ] ] , xi = 134480385 , Ii = 16 , Ai = - 227 , Ei = 482 , Ti = [ Oe , function ( e ) { return e } , function ( e , t , n ) { return t [ n + 0 ] } , function ( e , t , n ) { return t [ n + 1 ] } , function ( e , t , n ) { return t [ n - 1 ] } , function ( e , t , n ) { return Fe ( Fe ( e , t [ n + 1 ] ) , t [ n + 0 ] ) } , function ( e , t , n ) { return Fe ( e , t [ n - 1 ] ) } , function ( e , t , n ) { return Fe ( e , t [ n + 0 ] ) } , function ( e , t , n ) { return Fe ( t [ n - 1 ] , t [ n + 0 ] ) } , function ( e , t , n ) { return Fe ( t [ n + 0 ] , t [ n + 1 ] ) } , function ( e , t , n ) { return Fe ( Fe ( e , t [ n - 1 ] ) , Fe ( t [ n + 0 ] , t [ n + 1 ] ) ) } , function ( e , t , n ) { return 0 >= Math . abs ( ( e >> 24 & 255 ) - ( t [ n - 1 ] >> 24 & 255 ) ) - Math . abs ( ( t [ n + 0 ] >> 24 & 255 ) - ( t [ n - 1 ] >> 24 & 255 ) ) + ( Math . abs ( ( e >> 16 & 255 ) - ( t [ n - 1 ] >> 16 & 255 ) ) - Math . abs ( ( t [ n + 0 ] >> 16 & 255 ) - ( t [ n - 1 ] >> 16 & 255 ) ) ) + ( Math . abs ( ( e >> 8 & 255 ) - ( t [ n - 1 ] >> 8 & 255 ) ) - Math . abs ( ( t [ n + 0 ] >> 8 & 255 ) - ( t [ n - 1 ] >> 8 & 255 ) ) ) + ( Math . abs ( ( 255 & e ) - ( 255 & t [ n - 1 ] ) ) - Math . abs ( ( 255 & t [ n + 0 ] ) - ( 255 & t [ n - 1 ] ) ) ) ? t [ n + 0 ] : e } , function ( e , t , n ) { return ( Ne ( ( e >> 24 & 255 ) + ( t [ n + 0 ] >> 24 & 255 ) - ( t [ n - 1 ] >> 24 & 255 ) ) << 24 | Ne ( ( e >> 16 & 255 ) + ( t [ n + 0 ] >> 16 & 255 ) - ( t [ n - 1 ] >> 16 & 255 ) ) << 16 | Ne ( ( e >> 8 & 255 ) + ( t [ n + 0 ] >> 8 & 255 ) - ( t [ n - 1 ] >> 8 & 255 ) ) << 8 | Ne ( ( 255 & e ) + ( 255 & t [ n + 0 ] ) - ( 255 & t [ n - 1 ] ) ) ) >>> 0 } , function ( e , t , n ) { var a = t [ n - 1 ] ; return e = Fe ( e , t [ n + 0 ] ) , ( Re ( e >> 24 & 255 , a >> 24 & 255 ) << 24 | Re ( e >> 16 & 255 , a >> 16 & 255 ) << 16 | Re ( e >> 8 & 255 , a >> 8 & 255 ) << 8 | Re ( e >> 0 & 255 , a >> 0 & 255 ) ) >>> 0 } , Oe , Oe ] , Di = { Cc : f , Bc : f , Kc : f } , Pi = 16 , Fi = 16 , Ni = 16 , Ri = [ 2 , 3 , 7 ] , Oi = [ 3 , 3 , 11 ] , Ui = 0 , Li = 1 , Bi = 2 , ji = 3 , Hi = 4 , qi = [ xn + In , xn , xn , xn , 40 ] , Vi = 19 , zi = [ 17 , 18 , 0 , 1 , 2 , 3 , 4 , 5 , 16 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ] , Wi = 120 , Gi = [ 24 , 7 , 23 , 25 , 40 , 6 , 39 , 41 , 22 , 26 , 38 , 42 , 56 , 5 , 55 , 57 , 21 , 27 , 54 , 58 , 37 , 43 , 72 , 4 , 71 , 73 , 20 , 28 , 53 , 59 , 70 , 74 , 36 , 44 , 88 , 69 , 75 , 52 , 60 , 3 , 87 , 89 , 19 , 29 , 86 , 90 , 35 , 45 , 68 , 76 , 85 , 91 , 51 , 61 , 104 , 2 , 103 , 105 , 18 , 30 , 102 , 106 , 34 , 46 , 84 , 92 , 67 , 77 , 101 , 107 , 50 , 62 , 120 , 1 , 119 , 121 , 83 , 93 , 17 , 31 , 100 , 108 , 66 , 78 , 118 , 122 , 33 , 47 , 117 , 123 , 49 , 63 , 99 , 109 , 82 , 94 , 0 , 116 , 124 , 65 , 79 , 16 , 32 , 98 , 110 , 48 , 115 , 125 , 81 , 95 , 64 , 114 , 126 , 97 , 111 , 80 , 113 , 127 , 96 , 112 ] , Ki = 1 << Ii - 1 , Yi = c ( 256 , 0 ) , Zi = c ( 256 , 0 ) , Xi = c ( 256 , _ ) , Ji = c ( 256 , _ ) , Qi = c ( Ei - Ai , f ) , eo = c ( Ei - Ai , f ) , to = 0 , no = Array ( Xt ) , ao = [ function ( e , t , n , a , i , o , s , r , l , c , d , u , p ) { mt ( e , t , n , a , i , o , s , r , l , c , d , u , p , Me , 3 ) } , gt , function ( e , t , n , a , i , o , s , r , l , c , d , u , p ) { mt ( e , t , n , a , i , o , s , r , l , c , d , u , p , Ee , 3 ) } , ht , ft , _t , function ( e , t , n , a , i , o , s , r , l , c , d , u , p ) { mt ( e , t , n , a , i , o , s , r , l , c , d , u , p , xe , 2 ) } , gt , ht , ft , _t ] ; this . Hd = function ( e , t , n , a ) { return Ft ( Ut , e , t , n , a ) } , this . Id = function ( e , t , n , a ) { return Ft ( Lt , e , t , n , a ) } , this . Jd = function ( e , t , n , a ) { return Ft ( qt , e , t , n , a ) } , this . Ed = function ( e , t , n , a ) { return Ft ( Ht , e , t , n , a ) } , this . Fd = function ( e , t , n , a ) { return Ft ( Bt , e , t , n , a ) } , this . Gd = function ( e , t , n , a ) { return Ft ( jt , e , t , n , a ) } , this . WebPDecode = this . Dd = function ( t , n , a ) { var i = e ( un ) , o = "VP8StatusCode" ; return a == g ? tn : ( o = Nt ( t , [ 0 ] , [ n ] , a . input ) , o != Qt ? o == rn ? nn : o : ( i . j = a . j , i . Qa = a . Qa , o = Pt ( t , 0 , [ n ] , i ) ) ) } } } ( ) , function ( e , t ) { "use strict" ; angular . module ( "toaster" , [ ] ) . constant ( "toasterConfig" , { limit : 0 , "tap-to-dismiss" : ! 0 , "close-button" : ! 1 , "close-html" : '<button class="toast-close-button" type="button">×</button>' , "newest-on-top" : ! 0 , "time-out" : 5e3 , "icon-classes" : { error : "toast-error" , info : "toast-info" , wait : "toast-wait" , success : "toast-success" , warning : "toast-warning" } , "body-output-type" : "" , "body-template" : "toasterBodyTmpl.html" , "icon-class" : "toast-info" , "position-class" : "toast-top-right" , "title-class" : "toast-title" , "message-class" : "toast-message" , "prevent-duplicates" : ! 1 , "mouseover-timer-stop" : ! 0 } ) . service ( "toaster" , [ "$rootScope" , "toasterConfig" , function ( e , t ) { function n ( e ) { return function ( t , n , a , i , o , s , r , l , c ) { return angular . isString ( t ) ? this . pop ( e , t , n , a , i , o , s , r , l , c ) : this . pop ( angular . extend ( t , { type : e } ) ) } } var a = function ( ) { var e = { } ; return e . newGuid = function ( ) { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx" . replace ( /[xy]/g , function ( e ) { var t = 16 * Math . random ( ) | 0 , n = "x" == e ? t : 3 & t | 8 ; return n . toString ( 16 ) } ) } , e } ( ) ; this . pop = function ( t , n , i , o , s , r , l , c , d , u ) { if ( angular . isObject ( t ) ) { var p = t ; this . toast = { type : p . type , title : p
g = p . constructors [ u ] ; break } if ( ! g ) throw new Error ( "Constructor not found for predicate: " + e ) } else { var n = this . readInt ( t + "[id]" ) , a = uintToInt ( n ) ; if ( 812830625 == a ) { var i = this . fetchBytes ( t + "[packed_string]" ) , o = gzipUncompress ( i ) , s = bytesToArrayBuffer ( o ) , r = new TLDeserialization ( s ) ; return r . fetchObject ( e , t ) } var f = p . constructorsIndex ; if ( ! f ) { p . constructorsIndex = f = { } ; for ( var u = 0 ; u < p . constructors . length ; u ++ ) f [ p . constructors [ u ] . id ] = u } var u = f [ a ] ; u && ( g = p . constructors [ u ] ) ; var _ = ! 1 ; if ( ! g && this . mtproto ) { var v = Config . Schema . API ; for ( u = 0 ; u < v . constructors . length ; u ++ ) if ( v . constructors [ u ] . id == a ) { g = v . constructors [ u ] , delete this . mtproto , _ = ! 0 ; break } } if ( ! g ) throw new Error ( "Constructor not found: " + n + " " + this . fetchInt ( ) + " " + this . fetchInt ( ) ) } m = g . predicate ; var c = { _ : m } , y = ( this . mtproto ? "mt_" : "" ) + m , b = this ; if ( this . override [ y ] ) this . override [ y ] . apply ( this , [ c , t + "[" + m + "]" ] ) ; else { var u , w , e , k , $ , C , S , l = g . params . length ; for ( u = 0 ; u < l ; u ++ ) { if ( w = g . params [ u ] , e = w . type , "#" == e && void 0 === c . pFlags && ( c . pFlags = { } ) , k = e . indexOf ( "?" ) !== - 1 ) { if ( $ = e . split ( "?" ) , C = $ [ 0 ] . split ( "." ) , ! ( c [ C [ 0 ] ] & 1 << C [ 1 ] ) ) continue ; e = $ [ 1 ] } S = b . fetchObject ( e , t + "[" + m + "][" + w . name + "]" ) , k && "true" === e ? c . pFlags [ w . name ] = S : c [ w . name ] = S } } return _ && ( this . mtproto = ! 0 ) , c } , TLDeserialization . prototype . getOffset = function ( ) { return this . offset } , TLDeserialization . prototype . fetchEnd = function ( ) { if ( this . offset != this . byteView . length ) throw new Error ( "Fetch end with non-empty buffer" ) ; return ! 0 } , angular . module ( "izhukov.utils" , [ ] ) . provider ( "Storage" , function ( ) { this . setPrefix = function ( e ) { ConfigStorage . prefix ( e ) } , this . $get = [ "$q" , function ( e ) { var t = { } ; return angular . forEach ( [ "get" , "set" , "remove" , "clear" ] , function ( n ) { t [ n ] = function ( ) { var t = e . defer ( ) , a = Array . prototype . slice . call ( arguments ) ; return a . push ( function ( e ) { t . resolve ( e ) } ) , ConfigStorage [ n ] . apply ( ConfigStorage , a ) , t . promise } } ) , t . noPrefix = function ( ) { ConfigStorage . noPrefix ( ) } , t } ] } ) . service ( "qSync" , function ( ) { return { when : function ( e ) { return { then : function ( t ) { return t ( e ) } } } , reject : function ( e ) { return { then : function ( t , n ) { if ( n ) return n ( e ) } } } } } ) . service ( "FileManager" , [ "$window" , "$q" , "$timeout" , "qSync" , function ( e , t , n , a ) { function i ( ) { return f } function o ( e , n ) { return l ( n ) . then ( function ( n ) { return s ( n , e ) . then ( function ( ) { return n } , function ( e ) { return t . reject ( e ) } ) } ) } function s ( e , n ) { var a = t . defer ( ) ; if ( e . onwriteend = function ( e ) { a . resolve ( ) } , e . onerror = function ( e ) { a . reject ( e ) } , n . file ) n . file ( function ( t ) { e . write ( t ) } , function ( e ) { a . reject ( e ) } ) ; else if ( n instanceof Blob ) e . write ( n ) ; else try { var i = blobConstruct ( [ bytesToArrayBuffer ( n ) ] ) ; e . write ( i ) } catch ( o ) { a . reject ( o ) } return a . promise } function r ( n , i , o ) { if ( ! e . chrome || ! chrome . fileSystem || ! chrome . fileSystem . chooseEntry ) return a . reject ( ) ; var s = t . defer ( ) ; return chrome . fileSystem . chooseEntry ( { type : "saveFile" , suggestedName : n , accepts : [ { mimeTypes : [ o ] , extensions : [ i ] } ] } , function ( e ) { s . resolve ( e ) } ) , s . promise } function l ( e ) { var n = t . defer ( ) ; return e . createWriter ( function ( e ) { n . resolve ( e ) } , function ( e ) { n . reject ( e ) } ) , n . promise } function c ( e , t ) { var n = [ ] , a = { write : function ( e ) { return f ? ( n . push ( e ) , void setZeroTimeout ( function ( ) { a . onwriteend && a . onwriteend ( ) } ) ) : ( a . onerror && a . onerror ( new Error ( "Blob not supported by browser" ) ) , ! 1 ) } , truncate : function ( ) { n = [ ] } , finalize : function ( ) { var a = blobConstruct ( n , e ) ; return t && t ( a ) , a } } ; return a } function d ( e , t ) { return void 0 !== e . toURL ? e . toURL ( t ) : e instanceof Blob ? URL . createObjectURL ( e ) : "data:" + t + ";base64," + bytesToBase64 ( e ) } function u ( e ) { if ( e instanceof Blob ) { var n = t . defer ( ) ; try { var a = new FileReader ; return a . onloadend = function ( e ) { n . resolve ( new Uint8Array ( e . target . result ) ) } , a . onerror = function ( e ) { n . reject ( e ) } , a . readAsArrayBuffer ( e ) , n . promise } catch ( i ) { return t . reject ( i ) } } else if ( e . file ) { var n = t . defer ( ) ; return e . file ( function ( e ) { u ( e ) . then ( function ( e ) { n . resolve ( e ) } , function ( e ) { n . reject ( e ) } ) } , function ( e ) { n . reject ( e ) } ) , n . promise } return t . when ( e ) } function p ( e ) { var n ; try { var a = new FileReader ; a . onloadend = function ( ) { n . resolve ( a . result ) } , a . readAsDataURL ( e ) } catch ( i ) { return t . reject ( i ) } return n = t . defer ( ) , n . promise } function m ( e , t ) { if ( h && e instanceof Blob ) { var t = e . type || e . mimeType || t || "" ; if ( ! t . match ( /image\/(jpeg|gif|png|bmp)|video\/quicktime/ ) ) return p ( e ) } return a . when ( d ( e , t ) ) } function
url : _ } ; try { g = o . post ( _ , h , { responseType : "arraybuffer" , transformRequest : null } ) } catch ( y ) { g = s . reject ( angular . extend ( v , { originalError : y } ) ) } return g . then ( function ( e ) { if ( ! e . data || ! e . data . byteLength ) return s . reject ( v ) ; try { var t = new TLDeserialization ( e . data , { mtproto : ! 0 } ) ; t . fetchLong ( "auth_key_id" ) , t . fetchLong ( "msg_id" ) , t . fetchInt ( "msg_len" ) } catch ( n ) { return s . reject ( angular . extend ( v , { originalError : n } ) ) } return t } , function ( e ) { return e . message || e . type || ( e = angular . extend ( v , { originalError : e } ) ) , s . reject ( e ) } ) } function c ( e ) { var n = e . deferred , a = new TLSerialization ( { mtproto : ! 0 } ) ; a . storeMethod ( "req_pq" , { nonce : e . nonce } ) , console . log ( dT ( ) , "Send req_pq" , bytesToHex ( e . nonce ) ) , l ( e . dcID , a . getBuffer ( ) ) . then ( function ( a ) { var o = a . fetchObject ( "ResPQ" ) ; if ( "resPQ" != o . _ ) throw new Error ( "resPQ response invalid: " + o . _ ) ; if ( ! bytesCmp ( e . nonce , o . nonce ) ) throw new Error ( "resPQ nonce mismatch" ) ; if ( e . serverNonce = o . server _nonce , e . pq = o . pq , e . fingerprints = o . server _public _key _fingerprints , console . log ( dT ( ) , "Got ResPQ" , bytesToHex ( e . serverNonce ) , bytesToHex ( e . pq ) , e . fingerprints ) , e . publicKey = t . select ( e . fingerprints ) , ! e . publicKey ) throw new Error ( "No public key found" ) ; console . log ( dT ( ) , "PQ factorization start" , e . pq ) , i . factorize ( e . pq ) . then ( function ( t ) { e . p = t [ 0 ] , e . q = t [ 1 ] , console . log ( dT ( ) , "PQ factorization done" , t [ 2 ] ) , d ( e ) } , function ( e ) { console . log ( "Worker error" , e , e . stack ) , n . reject ( e ) } ) } , function ( e ) { console . error ( dT ( ) , "req_pq error" , e . message ) , n . reject ( e ) } ) , r ( function ( ) { t . prepare ( ) } ) } function d ( e ) { var t = e . deferred ; e . newNonce = new Array ( 32 ) , n . nextBytes ( e . newNonce ) ; var a = new TLSerialization ( { mtproto : ! 0 } ) ; a . storeObject ( { _ : "p_q_inner_data" , pq : e . pq , p : e . p , q : e . q , nonce : e . nonce , server _nonce : e . serverNonce , new _nonce : e . newNonce } , "P_Q_inner_data" , "DECRYPTED_DATA" ) ; var i = sha1BytesSync ( a . getBuffer ( ) ) . concat ( a . getBytes ( ) ) , o = new TLSerialization ( { mtproto : ! 0 } ) ; o . storeMethod ( "req_DH_params" , { nonce : e . nonce , server _nonce : e . serverNonce , p : e . p , q : e . q , public _key _fingerprint : e . publicKey . fingerprint , encrypted _data : rsaEncrypt ( e . publicKey , i ) } ) , console . log ( dT ( ) , "Send req_DH_params" ) , l ( e . dcID , o . getBuffer ( ) ) . then ( function ( n ) { var a = n . fetchObject ( "Server_DH_Params" , "RESPONSE" ) ; if ( "server_DH_params_fail" != a . _ && "server_DH_params_ok" != a . _ ) return t . reject ( new Error ( "Server_DH_Params response invalid: " + a . _ ) ) , ! 1 ; if ( ! bytesCmp ( e . nonce , a . nonce ) ) return t . reject ( new Error ( "Server_DH_Params nonce mismatch" ) ) , ! 1 ; if ( ! bytesCmp ( e . serverNonce , a . server _nonce ) ) return t . reject ( new Error ( "Server_DH_Params server_nonce mismatch" ) ) , ! 1 ; if ( "server_DH_params_fail" == a . _ ) { var i = sha1BytesSync ( e . newNonce ) . slice ( - 16 ) ; return bytesCmp ( i , a . new _nonce _hash ) ? ( t . reject ( new Error ( "server_DH_params_fail" ) ) , ! 1 ) : ( t . reject ( new Error ( "server_DH_params_fail new_nonce_hash mismatch" ) ) , ! 1 ) } try { u ( e , a . encrypted _answer ) } catch ( o ) { return t . reject ( o ) , ! 1 } p ( e ) } , function ( e ) { t . reject ( e ) } ) } function u ( e , t ) { e . localTime = tsNow ( ) , e . tmpAesKey = sha1BytesSync ( e . newNonce . concat ( e . serverNonce ) ) . concat ( sha1BytesSync ( e . serverNonce . concat ( e . newNonce ) ) . slice ( 0 , 12 ) ) , e . tmpAesIv = sha1BytesSync ( e . serverNonce . concat ( e . newNonce ) ) . slice ( 12 ) . concat ( sha1BytesSync ( [ ] . concat ( e . newNonce , e . newNonce ) ) , e . newNonce . slice ( 0 , 4 ) ) ; var n = aesDecryptSync ( t , e . tmpAesKey , e . tmpAesIv ) , i = n . slice ( 0 , 20 ) , o = n . slice ( 20 ) , s = bytesToArrayBuffer ( o ) , r = new TLDeserialization ( s , { mtproto : ! 0 } ) , l = r . fetchObject ( "Server_DH_inner_data" ) ; if ( "server_DH_inner_data" != l . _ ) throw new Error ( "server_DH_inner_data response invalid: " + constructor ) ; if ( ! bytesCmp ( e . nonce , l . nonce ) ) throw new Error ( "server_DH_inner_data nonce mismatch" ) ; if ( ! bytesCmp ( e . serverNonce , l . server _nonce ) ) throw new Error ( "server_DH_inner_data serverNonce mismatch" ) ; console . log ( dT ( ) , "Done decrypting answer" ) , e . g = l . g , e . dhPrime = l . dh _prime , e . gA = l . g _a , e . serverTime = l . server _time , e . retry = 0 ; var c = r . getOffset ( ) ; if ( ! bytesCmp ( i , sha1BytesSync ( o . slice ( 0 , c ) ) ) ) throw new Error ( "server_DH_inner_data SHA1-hash mismatch" ) ; a . applyServerTime ( e . serverTime , e . localTime ) } function p ( e ) { var t = e . deferred , a = bytesFromHex ( e . g . toString ( 16 ) ) ; e . b = new Array ( 256 ) , n . nextBytes ( e . b ) , i . modPow ( a , e . b , e . dhPrime ) . then ( function ( n ) { var a = new TLSerialization ( { mtproto : ! 0 } ) ; a . storeObject ( { _ : "client_DH_inner_data" , nonce : e . nonce , serve
function u ( ) { if ( ! f && ! Config . Navigator . mobile && ! Config . Modes . packed ) { f = ! 0 , l . start ( ) , t . $watch ( "idle.isIDLE" , g ) , i ( g , 5e3 ) , g ( ) ; try { $ ( $window ) . on ( "beforeunload" , p ) } catch ( e ) { } } } function p ( ) { s . remove ( _ ? "xt_instance" : "xt_idle_instance" ) } function m ( ) { if ( _ || y ) return ! 1 ; console . log ( dT ( ) , "deactivate" ) , v = ! 1 , y = ! 0 , p ( ) , o . dismissAll ( ) , document . title = e ( "inactive_tab_title_raw" ) ; var a = n ( "<ng-include src=\"'partials/desktop/inactive.html'\"></ng-include>" ) , i = t . $new ( ! 0 ) ; i . close = function ( ) { r . close ( ) } , i . reload = function ( ) { r . reload ( ) } , a ( i , function ( e ) { $ ( ".page_wrap" ) . hide ( ) , $ ( e ) . appendTo ( $ ( "body" ) ) } ) , t . idle . deactivated = ! 0 } function g ( ) { if ( y ) return ! 1 ; var e = tsNow ( ) , n = t . idle && t . idle . isIDLE , i = { id : h , idle : n , time : e } ; s . get ( "xt_instance" , "xt_idle_instance" ) . then ( function ( t ) { var o = t [ 0 ] , r = t [ 1 ] ; ! n || ! o || o . id == h || o . time < e - 6e4 ? ( r && r . id == h && s . remove ( "xt_idle_instance" ) , s . set ( { xt _instance : i } ) , _ || ( d . startAll ( ) , console . warn ( dT ( ) , "now master instance" , i ) ) , _ = ! 0 , v && ( a . cancel ( v ) , v = ! 1 ) ) : ( s . set ( { xt _idle _instance : i } ) , _ && ( d . stopAll ( ) , console . warn ( dT ( ) , "now idle instance" , i ) , v || ( v = a ( m , 3e4 ) ) ) , _ = ! 1 ) } ) } var h = nextRandomInt ( 4294967295 ) , f = ! 1 , _ = ! 1 , v = ! 1 , y = ! 1 ; return { start : u } } ] ) ; var extraModules = [ ] ; Config . Modes . animations && extraModules . push ( "ngAnimate" ) , angular . module ( "myApp" , [ "ngRoute" , "ngSanitize" , "ngTouch" , "ui.bootstrap" , "mediaPlayer" , "toaster" , "izhukov.utils" , "izhukov.mtproto" , "izhukov.mtproto.wrapper" , "myApp.filters" , "myApp.services" , "myApp.templates" , "myApp.directives" , "myApp.controllers" ] . concat ( extraModules ) ) . config ( [ "$locationProvider" , "$routeProvider" , "$compileProvider" , "StorageProvider" , function ( e , t , n , a ) { n . imgSrcSanitizationWhitelist ( /^\s*(https?|ftp|file|blob|filesystem|chrome-extension|app):|data:image\// ) , n . aHrefSanitizationWhitelist ( /^\s*(https?|ftp|file|tg|mailto|blob|filesystem|chrome-extension|app):|data:/ ) , n . debugInfoEnabled ( ! 1 ) , Config . Modes . test && a . setPrefix ( "t_" ) , t . when ( "/" , { templateUrl : templateUrl ( "welcome" ) , controller : "AppWelcomeController" } ) , t . when ( "/login" , { templateUrl : templateUrl ( "login" ) , controller : "AppLoginController" } ) , t . when ( "/im" , { templateUrl : templateUrl ( "im" ) , controller : "AppIMController" , reloadOnSearch : ! 1 } ) , t . otherwise ( { redirectTo : "/" } ) } ] ) , angular . module ( "myApp.services" , [ "myApp.i18n" , "izhukov.utils" ] ) . service ( "AppUsersManager" , [ "$rootScope" , "$modal" , "$modalStack" , "$filter" , "$q" , "qSync" , "MtpApiManager" , "RichTextProcessor" , "ServerTimeManager" , "Storage" , "_" , function ( e , t , n , a , i , o , s , r , l , c , d ) { function u ( ) { return R ? R : R = s . invokeApi ( "contacts.getContacts" , { hash : "" } ) . then ( function ( e ) { var t , n ; O = [ ] , h ( e . users ) ; for ( var n = 0 ; n < e . contacts . length ; n ++ ) t = e . contacts [ n ] . user _id , O . push ( t ) , SearchIndexManager . indexObject ( t , p ( t ) , q ) ; return O } ) } function p ( e ) { var t = L [ e ] ; return ! ! t && ( t . first _name || "" ) + " " + ( t . last _name || "" ) + " " + ( t . phone || "" ) + " " + ( t . username || "" ) } function m ( e ) { return u ( ) . then ( function ( t ) { if ( angular . isString ( e ) && e . length ) { for ( var n = SearchIndexManager . search ( e , q ) , a = [ ] , i = 0 ; i < t . length ; i ++ ) n [ t [ i ] ] && a . push ( t [ i ] ) ; t = a } return t } ) } function g ( e ) { return B [ e ] || 0 } function h ( e ) { angular . forEach ( e , f ) } function f ( t , n ) { if ( angular . isObject ( t ) && ! ( n && angular . isObject ( L [ t . id ] ) && L [ t . id ] . first _name ) ) { var i = t . id , o = L [ i ] ; if ( void 0 === t . pFlags && ( t . pFlags = { } ) , ! t . pFlags . min || void 0 === o ) { if ( t . phone && ( t . rPhone = a ( "phoneNumber" ) ( t . phone ) ) , t . num = Math . abs ( i ) % 8 + 1 , t . first _name ? ( t . rFirstName = r . wrapRichText ( t . first _name , { noLinks : ! 0 , noLinebreaks : ! 0 } ) , t . rFullName = t . last _name ? r . wrapRichText ( t . first _name + " " + ( t . last _name || "" ) , { noLinks : ! 0 , noLinebreaks : ! 0 } ) : t . rFirstName ) : ( t . rFirstName = r . wrapRichText ( t . last _name , { noLinks : ! 0 , noLinebreaks : ! 0 } ) || t . rPhone || d ( "user_first_name_deleted" ) , t . rFullName = r . wrapRichText ( t . last _name , { noLinks : ! 0 , noLinebreaks : ! 0 } ) || t . rPhone || d ( "user_name_deleted" ) ) , t . username ) { var s = SearchIndexManager . cleanUsername ( t . username ) ; B [ s ] = i } t . sortName = t . pFlags . deleted ? "" : SearchIndexManager . cleanSearchText ( t . first _name + " " + ( t . last _name || "" ) ) ; var c = t . sortName . split ( " " ) , u = c . shift ( ) , p = c . pop ( ) ; t . initials = u . charAt ( 0 ) + ( p ? p . charAt ( 0 ) : u . charAt ( 1 ) ) , t . status && ( t . status . expires && ( t . status . expires -= l . serverTimeOffset ) , t . status . was _online && ( t . status . was _online -= l . serverTimeOffset ) ) , t . pFlags . bot ? t . sortStatus = - 1 : t . sortStat
all _stickers : e } ) , u ( e ) ) : p ( e , t && t . fullSets ) . then ( function ( ) { return r . set ( { all _stickers : e } ) , u ( e ) } ) } ) } ) } function u ( e ) { if ( w !== e . hash ) { w = e . hash ; var t , n , i , o , r , l , c , d ; for ( k = [ ] , i = e . sets . length , t = 0 ; t < i ; t ++ ) if ( l = e . sets [ t ] , ! l . pFlags . disabled ) { for ( d = e . fullSets [ l . id ] . documents , o = d . length , c = [ ] , n = 0 ; n < o ; n ++ ) r = d [ n ] , s . saveDoc ( r ) , c . push ( r . id ) ; l . docIDs = c , k . push ( l ) } } return m ( ) . then ( function ( e ) { var t = k ; if ( e . length ) { t = k . slice ( ) ; var n , i , o = [ ] ; for ( n = 0 , i = e . length ; n < i ; n ++ ) o . push ( e [ n ] . id ) ; t . unshift ( { id : 0 , title : a ( "im_stickers_tab_recent_raw" ) , short _name : "" , docIDs : o } ) } return t } ) } function p ( t , n ) { var a = [ ] , i = n || t . fullSets || { } ; return t . fullSets = { } , angular . forEach ( t . sets , function ( e ) { var n = i [ e . id ] ; if ( n && n . set . hash == e . hash ) t . fullSets [ e . id ] = n ; else { var s = o . invokeApi ( "messages.getStickerSet" , { stickerset : { _ : "inputStickerSetID" , id : e . id , access _hash : e . access _hash } } ) . then ( function ( n ) { t . fullSets [ e . id ] = n } ) ; a . push ( s ) } } ) , e . all ( a ) } function m ( ) { return r . get ( "stickers_popular" ) . then ( function ( e ) { var t , n , a , i = [ ] ; if ( e && e . length ) for ( t = 0 , n = e . length ; t < n ; t ++ ) a = e [ t ] [ 0 ] , s . hasDoc ( a ) && i . push ( { id : a , rate : e [ t ] [ 1 ] } ) ; return i } ) } function g ( e ) { m ( ) . then ( function ( t ) { for ( var n = ! 1 , a = t . length , i = [ ] , o = 0 ; o < a ; o ++ ) t [ o ] . id == e && ( n = ! 0 , t [ o ] . rate ++ ) , i . push ( [ t [ o ] . id , t [ o ] . rate ] ) ; n ? i . sort ( function ( e , t ) { return t [ 1 ] - e [ 1 ] } ) : ( i . length > 15 && ( i = i . slice ( 0 , 15 ) ) , i . push ( [ e , 1 ] ) ) , ConfigStorage . set ( { stickers _popular : i } ) } ) } function h ( e ) { return o . invokeApi ( "messages.getStickerSet" , { stickerset : e } ) . then ( function ( e ) { for ( var t = 0 ; t < e . documents . length ; t ++ ) s . saveDoc ( e . documents [ t ] ) ; return e } ) } function f ( e , t ) { var n = t ? "messages.uninstallStickerSet" : "messages.installStickerSet" , a = { _ : "inputStickerSetID" , id : e . set . id , access _hash : e . set . access _hash } ; return o . invokeApi ( n , { stickerset : a , disabled : ! 1 } ) . then ( function ( n ) { var a ; a = t ? { _ : "updateDelStickerSet" , id : e . set . id } : { _ : "updateNewStickerSet" , stickerset : e } , l . processUpdateMessage ( { _ : "updateShort" , update : a } ) } ) } function _ ( e ) { return v ( { _ : "inputStickerSetShortName" , short _name : e } ) } function v ( e ) { var a = t . $new ( ! 0 ) ; a . inputStickerset = e ; n . open ( { templateUrl : templateUrl ( "stickerset_modal" ) , controller : "StickersetModalController" , scope : a , windowClass : "stickerset_modal_window mobile_modal" } ) } function y ( e ) { for ( var t , n = 0 , a = 0 ; a < e . length ; a ++ ) t = e [ a ] , ! t . pFlags . disabled && t . pFlags . installed && ( n = ( 20261 * n + 2147483648 + t . hash ) % 2147483648 ) ; return n } var b = ! 1 , w = ! 1 , k = [ ] ; return t . $on ( "apiUpdate" , function ( e , n ) { return ( "updateStickerSets" == n . _ || "updateNewStickerSet" == n . _ || "updateDelStickerSet" == n . _ || "updateStickerSetsOrder" == n . _ ) && r . get ( "all_stickers" ) . then ( function ( e ) { switch ( e && e . layer == Config . Schema . API . layer || t . $broadcast ( "stickers_changed" ) , n . _ ) { case "updateNewStickerSet" : for ( var a = n . stickerset , i = a . set , o = ! 1 , s = 0 , l = e . sets . length ; s < l ; s ++ ) if ( e . sets [ s ] . id == i . id ) { o = s ; break } o !== ! 1 && e . sets . splice ( o , 1 ) , i . pFlags . installed = ! 0 , e . sets . unshift ( i ) , e . fullSets [ i . id ] = a ; break ; case "updateDelStickerSet" : for ( var i , s = 0 , l = e . sets . length ; s < l ; s ++ ) if ( i = e . sets [ s ] , i . id == n . id ) { i . pFlags . installed = ! 1 , e . sets . splice ( s , 1 ) ; break } delete e . fullSets [ n . id ] ; break ; case "updateStickerSetsOrder" : var c = n . order ; e . sets . sort ( function ( e , t ) { return c . indexOf ( e . id ) - c . indexOf ( t . id ) } ) } e . hash = y ( e . sets ) , e . date = 0 , r . set ( { all _stickers : e } ) . then ( function ( ) { t . $broadcast ( "stickers_changed" ) } ) } ) } ) , { start : c , getStickers : d , openStickersetLink : _ , openStickerset : v , installStickerset : f , pushPopularSticker : g , getStickerset : h } } ] ) . service ( "AppInlineBotsManager" , [ "qSync" , "$q" , "$rootScope" , "toaster" , "Storage" , "ErrorService" , "MtpApiManager" , "AppMessagesManager" , "AppMessagesIDsManager" , "AppDocsManager" , "AppPhotosManager" , "RichTextProcessor" , "AppUsersManager" , "AppPeersManager" , "PeersSelectService" , "GeoLocationManager" , function ( e , t , n , a , i , o , s , r , l , c , d , u , p , m , g , h ) { function f ( ) { return i . get ( "inline_bots_popular" ) . then ( function ( e ) { var t , n , a , i = [ ] ; if ( e && e . length ) { var o = tsNow ( ! 0 ) ; for ( t = 0 , n = e . length ; t < n ; t ++ ) o - e [ t ] [ 3 ] > 1209600 || ( a = e [ t ] [ 0 ] , p . hasUser ( a ) || p . saveApiUser ( e [ t ] [ 1 ] ) , i . push ( { id : a , rate : e [ t ] [ 2 ] , date : e [ t ] [ 3 ] } ) ) } return i } ) } function _ ( e ) { f ( ) . then ( function ( t ) { for ( var a = ! 1 , i = t . length , o = [ ] , s = 0 ; s < i ; s ++ ) { t [ s ] . id == e && ( a = ! 0 , t [ s ] . rate ++ , t [ s ] . date = tsNow ( ! 0 ) ) ; var r = p . getUser ( t [ s ] . id ) ; o . push ( [ t [ s ] . id , r , t [ s ] . rate , t [ s ] . date ] ) } a ? o . sort ( fun
function c ( e , t ) { return console . warn ( dT ( ) , "get draft" , e , t ) , r . get ( "draft" + e ) . then ( function ( n ) { "string" == typeof n && ( n = n . length > 0 && { text : n } ) , n || t ? console . warn ( dT ( ) , "local" , n ) : ( n = d ( e ) , console . warn ( dT ( ) , "server" , n ) ) ; var a = n && n . replyToMsgID ; if ( a ) { var s = ! ! o . isChannel ( e ) && - e ; n . replyToMsgID = i . getFullMessageID ( a , s ) } return n } ) } function d ( e ) { var t = _ [ e ] ; return void 0 !== t && t } function u ( t , n , a ) { a && console . warn ( dT ( ) , "save draft" , t , n , a ) ; var i = h ( n ) ; return _ [ t ] = i , a && ( p ( t , i ) , e . $broadcast ( "draft_updated" , { peerID : t , draft : i } ) ) , i } function p ( e , t ) { console . warn ( dT ( ) , "change draft" , e , t ) , e || console . trace ( "empty peerID" ) , t || ( t = { text : "" , replyToMsgID : 0 } ) , t . replyToMsgID = t . replyToMsgID ? i . getMessageLocalID ( t . replyToMsgID ) : 0 ; var n = "draft" + e ; if ( g ( t ) ) r . remove ( n ) ; else { var a = { } ; a [ n ] = t , r . set ( a ) } } function m ( e , t ) { var n = g ( e ) , a = g ( t ) ; return ! ( ! n || ! a ) || n == a && ( e . replyToMsgID == t . replyToMsgID && e . text == t . text ) } function g ( e ) { return ! e || ! ( e . replyToMsgID > 0 ) && ( "string" != typeof e . text || ! e . text . length ) } function h ( e ) { if ( ! e || "draftMessage" != e . _ ) return ! 1 ; var t = s . parseEntities ( e . message ) , n = e . entities || [ ] ; t = s . mergeEntities ( t , n ) ; var a = s . wrapDraftText ( e . message , { entities : t } ) , i = s . wrapRichText ( e . message , { noLinks : ! 0 , noLinebreaks : ! 0 } ) ; return { text : a , richMessage : i , replyToMsgID : e . reply _to _msg _id || 0 , date : e . date - l . serverTimeOffset } } function f ( e ) { console . warn ( dT ( ) , "sync draft" , e ) , c ( e , ! 0 ) . then ( function ( t ) { var a = _ [ e ] ; if ( m ( a , t ) ) return void console . warn ( dT ( ) , "equal drafts" , t , a ) ; console . warn ( dT ( ) , "changed draft" , t , a ) ; var i , r = { flags : 0 , peer : o . getInputPeerByID ( e ) } ; if ( g ( t ) ) i = { _ : "draftMessageEmpty" } , r . message = "" ; else { i = { _ : "draftMessage" } ; var c = t . text , d = [ ] ; c = s . parseEmojis ( c ) , c = s . parseMarkdown ( c , d ) , t . replyToMsgID > 0 && ( r . flags |= 1 , r . reply _to _msg _id = t . replyToMsgID , i . reply _to _msg _id = t . replyToMsgID ) , d . length && ( r . flags |= 8 , r . entities = d , i . entities = d ) , r . message = c , i . message = c } n . invokeApi ( "messages.saveDraft" , r ) . then ( function ( ) { i . date = tsNow ( ! 0 ) + l . serverTimeOffset , u ( e , i , ! 0 ) } ) } ) } var _ = { } ; return e . $on ( "apiUpdate" , function ( e , t ) { if ( "updateDraftMessage" == t . _ ) { var n = o . getPeerID ( t . peer ) ; u ( n , t . draft , ! 0 ) } } ) , { getDraft : c , getServerDraft : d , saveDraft : u , changeDraft : p , syncDraft : f } } ] ) , angular . module ( "myApp.controllers" , [ "myApp.i18n" ] ) . controller ( "AppWelcomeController" , [ "$scope" , "$location" , "MtpApiManager" , "ErrorService" , "ChangelogNotifyService" , "LayoutSwitchService" , function ( e , t , n , a , i , o ) { n . getUserID ( ) . then ( function ( e ) { return e ? void t . url ( "/im" ) : "http:" != location . protocol || Config . Modes . http || Config . App . domains . indexOf ( location . hostname ) == - 1 ? void t . url ( "/login" ) : void ( location . href = location . href . replace ( /^http:/ , "https:" ) ) } ) , i . checkUpdate ( ) , o . start ( ) } ] ) . controller ( "AppLoginController" , [ "$scope" , "$rootScope" , "$location" , "$timeout" , "$modal" , "$modalStack" , "MtpApiManager" , "ErrorService" , "NotificationsManager" , "PasswordManager" , "ChangelogNotifyService" , "IdleManager" , "LayoutSwitchService" , "TelegramMeWebService" , "_" , function ( e , t , n , a , i , o , s , r , l , c , d , u , p , m , g ) { function h ( ) { var t = ( navigator . language || "" ) . toLowerCase ( ) , n = Config . LangCountries [ t ] , a = ! Config . Navigator . mobile ; if ( f ( [ "en" , "en-us" , "en-uk" ] . indexOf ( t ) == - 1 ? void 0 !== n ? n : t . indexOf ( "-" ) > 0 ? t . split ( "-" ) [ 1 ] . toUpperCase ( ) : "US" : "US" ) , a ) { var i = e . credentials . phone _country ; s . invokeApi ( "help.getNearestDc" , { } , { dcID : 2 , createNetworker : ! 0 } ) . then ( function ( t ) { i == e . credentials . phone _country && f ( t . country ) , t . nearest _dc != t . this _dc && s . getNetworker ( t . nearest _dc , { createNetworker : ! 0 } ) } ) } } function f ( e ) { if ( e ) { var t , n ; for ( t = 0 ; t < Config . CountryCodes . length ; t ++ ) if ( n = Config . CountryCodes [ t ] , n [ 0 ] == e ) return _ ( { name : g ( n [ 1 ] + "_raw" ) , code : n [ 2 ] } ) } return _ ( { name : g ( "country_select_modal_country_us_raw" ) , code : "+1" } ) } function _ ( t ) { C = t , e . credentials . phone _country != t . code ? e . credentials . phone _country = t . code : v ( ) , e . $broadcast ( "country_selected" ) , e . $broadcast ( "value_updated" ) } function v ( ) { var t , n , a , i = ( ( e . credentials . phone _country || "" ) + ( e . credentials . phone _number || "" ) ) . replace ( /\D+/g , "" ) , o = 0 , s = ! 1 ; if ( i . length ) if ( C && ! i . indexOf ( C . code . replace ( /\D+/g , "" ) ) ) s = C . name ; else for ( t = 0 ; t < Config . CountryCodes . length ; t ++ ) for ( n = 2 ; n < Config . CountryCodes [ t ] . length ; n ++ ) a = Config . CountryCodes [ t ] [ n ] . replace ( /\D+/g , "" ) , a . length > o && ! i . indexOf ( a ) && ( o = a . length , s = g ( Config . Coun
l && ( e . historyState . typing . length && e . historyState . typing . splice ( 0 , e . historyState . typing . length ) , e . $broadcast ( "ui_history_append_new" , { idleScroll : K && ! h && r } ) , r ? f && ( e . historyUnreadAfter = f , K = ! 0 , s = ! 0 ) : n ( function ( ) { d . readHistory ( e . curDialog . peerID ) } ) , C ( ) , S ( ) ) } } ) , o && e . $broadcast ( "messages_regroup" ) , s && e . $broadcast ( "messages_unread_after" ) } ) , e . $on ( "history_delete" , function ( t , n ) { var a = w ( n . peerID ) ; if ( a ) { var i , o = [ ] ; for ( i = 0 ; i < a . messages . length ; i ++ ) n . msgs [ a . messages [ i ] . mid ] || o . push ( a . messages [ i ] ) ; a . messages = o , d . regroupWrappedHistory ( a . messages ) , e . $broadcast ( "messages_regroup" ) , n . peerID == e . curDialog . peerID && ( e . state . empty = ! o . length , C ( ) ) } } ) , e . $on ( "dialog_flush" , function ( t , n ) { var a = w ( n . peerID ) ; a && ( a . messages = [ ] , a . ids = [ ] , n . peerID == e . curDialog . peerID && ( e . state . empty = ! 0 , C ( ) ) ) } ) , e . $on ( "history_focus" , function ( t , n ) { e . historyFilter . mediaType && V ( ) } ) , e . $on ( "apiUpdate" , function ( t , a ) { switch ( a . _ ) { case "updateUserTyping" : case "updateChatUserTyping" : l . forceUserOnline ( a . user _id ) , l . hasUser ( a . user _id ) && e . curDialog . peerID == ( "updateUserTyping" == a . _ ? a . user _id : - a . chat _id ) && ( e . historyState . typing . indexOf ( a . user _id ) == - 1 && e . historyState . typing . push ( a . user _id ) , n . cancel ( ce [ a . user _id ] ) , ce [ a . user _id ] = n ( function ( ) { var t = e . historyState . typing . indexOf ( a . user _id ) ; t !== - 1 && e . historyState . typing . splice ( t , 1 ) } , 6e3 ) ) } } ) , e . $on ( "history_need_less" , x ) , e . $on ( "history_need_more" , I ) , i . $watch ( "idle.isIDLE" , function ( t ) { t || ! e . curDialog || ! e . curDialog . peerID || e . historyFilter . mediaType || e . historyState . skipped || d . readHistory ( e . curDialog . peerID ) , t || ( K = ! 1 , le && le == e . curDialog . peerID && ( A ( ) , le = ! 1 ) ) } ) } ] ) . controller ( "AppImPanelController" , [ "$scope" , function ( e ) { e . $on ( "user_update" , angular . noop ) } ] ) . controller ( "AppImSendController" , [ "$rootScope" , "$q" , "$scope" , "$timeout" , "MtpApiManager" , "Storage" , "AppProfileManager" , "AppChatsManager" , "AppUsersManager" , "AppPeersManager" , "AppDocsManager" , "AppMessagesManager" , "AppInlineBotsManager" , "MtpApiFileManager" , "DraftsManager" , "RichTextProcessor" , function ( e , t , n , a , i , o , s , r , l , c , d , u , p , m , g , h ) { function f ( e ) { return n . $broadcast ( "ui_message_before_send" ) , a ( function ( ) { var e = n . draftMessage . text ; if ( angular . isString ( e ) && e . length > 0 ) { e = h . parseEmojis ( e ) ; var t = { replyToMsgID : n . draftMessage . replyToMsgID , clearDraft : ! 0 } ; do u . sendText ( n . curDialog . peerID , e . substr ( 0 , 4096 ) , t ) , e = e . substr ( 4096 ) ; while ( e . length ) } S ( ) , O == n . curDialog . peer ? O = ! 1 : g . changeDraft ( n . curDialog . peerID ) , y ( ) , n . $broadcast ( "ui_message_send" ) } ) , cancelEvent ( e ) } function _ ( ) { var e = n . curDialog . peerID ; if ( ! e ) return safeReplaceObject ( n . mentions , { } ) , void n . $broadcast ( "mentions_update" ) ; var a , i = [ ] , o = SearchIndexManager . createIndex ( ) , r = p . getPopularBots ( ) . then ( function ( e ) { var t = [ ] ; return angular . forEach ( e , function ( e ) { t . push ( e . id ) } ) , t } ) ; a = e < 0 ? s . getChatFull ( - e ) . then ( function ( e ) { var t = ( e . participants || { } ) . participants || [ ] , n = [ ] ; return angular . forEach ( t , function ( e ) { n . push ( e . user _id ) } ) , n } ) : t . when ( [ ] ) , t . all ( { pop : r , chat : a } ) . then ( function ( e ) { var t = { } , a = e . pop . concat ( e . chat ) ; angular . forEach ( a , function ( e ) { t [ e ] || ( t [ e ] = ! 0 , i . push ( l . getUser ( e ) ) , SearchIndexManager . indexObject ( e , l . getUserSearchText ( e ) , o ) ) } ) , safeReplaceObject ( n . mentions , { users : i , index : o } ) , n . $broadcast ( "mentions_update" ) } ) } function v ( ) { var e = n . curDialog . peerID ; return e ? void s . getPeerBots ( e ) . then ( function ( t ) { if ( ! t . length ) return safeReplaceObject ( n . commands , { } ) , void n . $broadcast ( "mentions_update" ) ; var a = e < 0 , i = [ ] , o = SearchIndexManager . createIndex ( ) ; angular . forEach ( t , function ( e ) { var t = "" ; if ( a ) { var n = l . getUser ( e . id ) ; n && n . username && ( t += "@" + n . username ) } var s = l . getUserSearchText ( e . id ) ; angular . forEach ( e . commands , function ( n , a ) { var r = "/" + a + t ; i . push ( { botID : e . id , value : r , rDescription : h . wrapRichText ( n , { noLinks : ! 0 , noLineBreaks : ! 0 } ) } ) , SearchIndexManager . indexObject ( r , s + " " + a + " " + n , o ) } ) } ) , safeReplaceObject ( n . commands , { list : i , index : o } ) , n . $broadcast ( "mentions_update" ) } ) : ( safeReplaceObject ( n . commands , { } ) , void n . $broadcast ( "mentions_update" ) ) } function y ( e , t ) { if ( t ) { var a = c . getPeerID ( t ) ; a && g . syncDraft ( a ) } if ( _ ( ) , v ( ) , $ ( ) , x ( ) , delete n . draftMessage . inlineProgress , n . $broadcast ( "inline_results" , ! 1 ) , O ) { if ( O == n . curDialog . peer ) return n . draftMessage . isBroadcast = c . isChannel ( n . curDialog . peerID ) && ! c . isMegagroup ( n . curDialog .
t . notify . desktop ? l . remove ( "notify_nodesktop" ) : l . set ( { notify _nodesktop : ! 0 } ) , e . $broadcast ( "settings_changed" ) } , t . togglePreview = function ( ) { t . notify . preview = ! t . notify . preview , t . notify . preview ? l . remove ( "notify_nopreview" ) : l . set ( { notify _nopreview : ! 0 } ) , e . $broadcast ( "settings_changed" ) } , t . toggleVibrate = function ( ) { t . notify . vibrate = ! t . notify . vibrate , t . notify . vibrate ? l . remove ( "notify_novibrate" ) : l . set ( { notify _novibrate : ! 0 } ) , e . $broadcast ( "settings_changed" ) } , t . toggleCtrlEnter = function ( n ) { t . send . enter = n , t . send . enter ? l . remove ( "send_ctrlenter" ) : l . set ( { send _ctrlenter : ! 0 } ) , e . $broadcast ( "settings_changed" ) } } ) , t . openChangelog = function ( ) { m . showChangelog ( ! 1 ) } , t . logOut = function ( ) { f . confirm ( { type : "LOGOUT" } ) . then ( function ( ) { r . logOut ( ) . then ( function ( ) { location . hash = "/login" , h . reload ( ) } ) } ) } , t . switchBackToDesktop = Config . Mobile && ! Config . Navigator . mobile , t . switchToDesktop = function ( ) { g . switchLayout ( ! 1 ) } } ] ) . controller ( "ChangelogModalController" , [ "$scope" , "$modal" , function ( e , t ) { if ( e . currentVersion = Config . App . version , ! e . lastVersion ) { var n = e . currentVersion . split ( "." ) ; e . lastVersion = n [ 0 ] + "." + n [ 1 ] + "." + Math . max ( 0 , n [ 2 ] - 1 ) } e . changelogHidden = ! 1 , e . changelogShown = ! 1 , e . canShowVersion = function ( t ) { if ( e . changelogShown ) return ! 0 ; var n = versionCompare ( t , e . lastVersion ) >= 0 ; return n || ( e . changelogHidden = ! 0 ) , n } , e . showAllVersions = function ( ) { e . changelogShown = ! 0 , e . changelogHidden = ! 1 , e . $emit ( "ui_height" ) , e . $broadcast ( "ui_height" ) } , e . changeUsername = function ( ) { t . open ( { templateUrl : templateUrl ( "username_edit_modal" ) , controller : "UsernameEditModalController" , windowClass : "md_simple_modal_window mobile_modal" } ) } } ] ) . controller ( "ProfileEditModalController" , [ "$scope" , "$modalInstance" , "AppUsersManager" , "MtpApiManager" , function ( e , t , n , a ) { e . profile = { } , e . error = { } , a . getUserID ( ) . then ( function ( t ) { var a = n . getUser ( t ) ; e . profile = { first _name : a . first _name , last _name : a . last _name } } ) , e . updateProfile = function ( ) { e . profile . updating = ! 0 ; var i = 3 ; a . invokeApi ( "account.updateProfile" , { flags : i , first _name : e . profile . first _name || "" , last _name : e . profile . last _name || "" } ) . then ( function ( a ) { e . error = { } , n . saveApiUser ( a ) , t . close ( ) } , function ( n ) { switch ( n . type ) { case "FIRSTNAME_INVALID" : e . error = { field : "first_name" } , n . handled = ! 0 ; break ; case "LASTNAME_INVALID" : e . error = { field : "last_name" } , n . handled = ! 0 ; break ; case "NAME_NOT_MODIFIED" : n . handled = ! 0 , t . close ( ) } } ) [ "finally" ] ( function ( ) { delete e . profile . updating } ) } } ] ) . controller ( "UsernameEditModalController" , [ "$scope" , "$modalInstance" , "AppUsersManager" , "MtpApiManager" , function ( e , t , n , a ) { e . profile = { } , e . error = { } , a . getUserID ( ) . then ( function ( t ) { var a = n . getUser ( t ) ; e . profile = { username : a . username } } ) , e . updateUsername = function ( ) { e . profile . updating = ! 0 , a . invokeApi ( "account.updateUsername" , { username : e . profile . username || "" } ) . then ( function ( a ) { e . checked = { } , n . saveApiUser ( a ) , t . close ( ) } , function ( e ) { "USERNAME_NOT_MODIFIED" == e . type && ( e . handled = ! 0 , t . close ( ) ) } ) [ "finally" ] ( function ( ) { delete e . profile . updating } ) } , e . $watch ( "profile.username" , function ( t ) { return t && t . length ? void a . invokeApi ( "account.checkUsername" , { username : t || "" } ) . then ( function ( n ) { e . profile . username == t && ( n ? e . checked = { success : ! 0 } : e . checked = { error : ! 0 } ) } , function ( n ) { if ( e . profile . username == t ) switch ( n . type ) { case "USERNAME_INVALID" : e . checked = { error : ! 0 } , n . handled = ! 0 } } ) : void ( e . checked = { } ) } ) } ] ) . controller ( "SessionsListModalController" , [ "$scope" , "$q" , "$timeout" , "_" , "MtpApiManager" , "ErrorService" , "$modalInstance" , function ( e , t , n , a , i , o , s ) { function r ( ) { n . cancel ( l ) , i . invokeApi ( "account.getAuthorizations" ) . then ( function ( t ) { e . sessionsLoaded = ! 0 , e . authorizations = t . authorizations ; for ( var a , i = 0 , o = e . authorizations . length ; i < o ; i ++ ) a = e . authorizations [ i ] , a . current = 1 == ( 1 & a . flags ) ; e . authorizations . sort ( function ( e , t ) { return e . current ? - 1 : t . current ? 1 : t . date _active - e . date _active } ) , c || ( l = n ( r , 5e3 ) ) } ) } e . slice = { limit : 20 , limitDelta : 20 } ; var l = ! 1 , c = ! 1 ; e . terminateSession = function ( e ) { o . confirm ( { type : "TERMINATE_SESSION" } ) . then ( function ( ) { i . invokeApi ( "account.resetAuthorization" , { hash : e } ) . then ( r ) } ) } , e . terminateAllSessions = function ( ) { o . confirm ( { type : "TERMINATE_SESSIONS" } ) . then ( function ( ) { i . invokeApi ( "auth.resetAuthorizations" , { } ) } ) } , r ( ) , e . $on ( "apiUpdate" , function ( e , t ) { "updateNewAuthorization" == t . _ && r ( )
id : a } ) . then ( function ( e ) { return e . link } ) : e . reject ( ) } function z ( e ) { var n = c . isChannel ( e ) , a = ke [ e ] , i = I ( e ) [ 0 ] ; if ( ! i || ! i . unread _count ) { if ( ! a || ! a . history . length ) return ! 1 ; var o , r , d = ! 1 ; for ( p = a . history . length ; p >= 0 ; p -- ) if ( o = a . history [ p ] , r = ye [ o ] , r && ! r . pFlags . out && r . pFlags . unread ) { d = ! 0 ; break } if ( ! d ) return ! 1 } if ( a . readPromise ) return a . readPromise ; var u ; if ( u = n ? f . invokeApi ( "channels.readHistory" , { channel : l . getChannelInput ( - e ) , max _id : 0 } ) : f . invokeApi ( "messages.readHistory" , { peer : c . getInputPeerByID ( e ) , max _id : 0 } ) . then ( function ( e ) { s . processUpdateMessage ( { _ : "updateShort" , update : { _ : "updatePts" , pts : e . pts , pts _count : e . pts _count } } ) } ) , a . readPromise = u . then ( function ( ) { i && ( i . unread _count = 0 , t . $broadcast ( "dialog_unread" , { peerID : e , count : 0 } ) , t . $broadcast ( "messages_read" ) , a && a . history . length && ( i . read _inbox _max _id = a . history [ 0 ] ) ) } ) [ "finally" ] ( function ( ) { delete a . readPromise } ) , a && a . history . length ) { var o , r , p , e , i ; for ( p = 0 ; p < a . history . length ; p ++ ) o = a . history [ p ] , r = ye [ o ] , r && ! r . pFlags . out && ( r . pFlags . unread = ! 1 , be [ o ] && ( be [ o ] . pFlags . unread = ! 1 ) , we [ o ] && ( we [ o ] . pFlags . unread = ! 1 ) , b . cancel ( "msg" + o ) ) } return b . soundReset ( c . getPeerString ( e ) ) , a . readPromise } function W ( e ) { f . invokeApi ( "messages.readMessageContents" , { id : e } ) . then ( function ( t ) { s . processUpdateMessage ( { _ : "updateShort" , update : { _ : "updateReadMessagesContents" , messages : e , pts : t . pts , pts _count : t . pts _count } } ) } ) } function G ( e , t ) { var n = 0 ; return t && ( n |= 1 ) , f . invokeApi ( "messages.deleteHistory" , { flags : n , peer : e , max _id : 0 } ) . then ( function ( n ) { return s . processUpdateMessage ( { _ : "updateShort" , update : { _ : "updatePts" , pts : n . pts , pts _count : n . pts _count } } ) , ! n . offset || G ( e , t ) } ) } function K ( e , n ) { return G ( c . getInputPeerByID ( e ) , n ) . then ( function ( ) { if ( n ) t . $broadcast ( "dialog_flush" , { peerID : e } ) ; else { var a = I ( e ) ; a [ 0 ] && $e . dialogs . splice ( a [ 1 ] , 1 ) , delete ke [ e ] , t . $broadcast ( "dialog_drop" , { peerID : e } ) } } ) } function Y ( e , t ) { t = t || { } , angular . forEach ( e , function ( e ) { if ( void 0 === e . pFlags && ( e . pFlags = { } ) , e . pFlags . out || ( e . pFlags . out = ! 1 ) , e . pFlags . unread || ( e . pFlags . unread = ! 1 ) , "messageEmpty" != e . _ ) { var n = ae ( e ) , a = "peerChannel" == e . to _id . _ , i = a ? - n : 0 , o = a && ! l . isMegagroup ( i ) , s = m . getFullMessageID ( e . id , i ) ; e . mid = s ; var r = I ( n ) [ 0 ] ; if ( r && s > 0 ) { var c = e . pFlags . out ? "read_outbox_max_id" : "read_inbox_max_id" ; e . pFlags . unread = s > r [ c ] } else t . isNew && ( e . pFlags . unread = ! 0 ) ; e . reply _to _msg _id && ( e . reply _to _mid = m . getFullMessageID ( e . reply _to _msg _id , i ) ) , e . date -= v . serverTimeOffset ; var p = e . fwd _from ; p && ( e . fwdFromID = p . channel _id ? - p . channel _id : p . from _id , p . date -= v . serverTimeOffset ) , e . peerID = n , e . fromID = e . pFlags . post ? n : e . from _id , e . signID = e . pFlags . post && e . from _id || p && p . channel _id && p . from _id , e . via _bot _id > 0 && ( e . viaBotID = e . via _bot _id ) ; var g = { user _id : e . fromID , date : e . date } ; if ( e . media ) switch ( e . media . _ ) { case "messageMediaEmpty" : delete e . media ; break ; case "messageMediaPhoto" : d . savePhoto ( e . media . photo , g ) ; break ; case "messageMediaDocument" : u . saveDoc ( e . media . document , g ) ; break ; case "messageMediaWebPage" : h . saveWebPage ( e . media . webpage , e . mid , g ) } if ( e . action ) { var f , _ ; switch ( e . action . _ ) { case "messageActionChatEditPhoto" : d . savePhoto ( e . action . photo , g ) , o && ( e . action . _ = "messageActionChannelEditPhoto" ) ; break ; case "messageActionChatEditTitle" : o && ( e . action . _ = "messageActionChannelEditTitle" ) ; break ; case "messageActionChatDeletePhoto" : o && ( e . action . _ = "messageActionChannelDeletePhoto" ) ; break ; case "messageActionChatAddUser" : 1 == e . action . users . length ? ( e . action . user _id = e . action . users [ 0 ] , e . fromID == e . action . user _id && ( a ? e . action . _ = "messageActionChatJoined" : e . action . _ = "messageActionChatReturn" ) ) : e . action . users . length > 1 && ( e . action . _ = "messageActionChatAddUsers" ) ; break ; case "messageActionChatDeleteUser" : e . fromID == e . action . user _id && ( e . action . _ = "messageActionChatLeave" ) ; break ; case "messageActionChannelMigrateFrom" : f = - e . action . chat _id , _ = - i ; break ; case "messageActionChatMigrateTo" : f = - i , _ = - e . action . channel _id ; break ; case "messageActionHistoryClear" : e . deleted = ! 0 , e . clear _history = ! 0 , e . pFlags . out = ! 1 , e . pFlags . unread = ! 1 } f && _ && ! Ve [ f ] && ! ze [ _ ] && R ( f , _ ) } if ( e . message && e . message . length ) { var b = y . parseEntities ( e . message ) , w = e . entities || [ ] ; e . totalEntities = y . mergeEntities ( b , w , ! e . pending ) } t . isEdited || ( ye [ s ] = e ) } } ) } function Z ( e , n , a ) { if ( angular . isString ( n ) ) { a = a || { } ; var i = a . entities || [ ] ; if ( a . viaBotID || ( n = y . parseMarkdo
e . put ( "partials/desktop/changelog_modal.html" , '<div class="changelog_modal_wrap md_modal_wrap" my-modal-position>\n\n <div class="md_modal_head">\n <div class="md_modal_title_wrap">\n <div class="md_modal_actions_wrap clearfix">\n <a class="md_modal_action md_modal_action_close" ng-click="$close()" my-i18n="modal_close"></a>\n </div>\n <div class="md_modal_title" my-i18n="head_about"></div>\n </div>\n\n <div class="peer_modal_profile_wrap clearfix">\n <div class="peer_modal_photo_wrap pull-left">\n <div class="peer_modal_photo telegram_modal_logo"></div>\n </div>\n <div class="peer_modal_profile">\n <div class="peer_modal_profile_name">Telegram Web</div>\n <div class="peer_modal_profile_description">Version {{currentVersion}}</div>\n </div>\n </div>\n </div>\n\n <div class="md_modal_split_actions_wrap">\n <div class="md_modal_split_actions">\n <a href="https://twitter.com/telegram_web" target="_blank" class="md_modal_split_action">\n <i class="md_modal_split_action_twitter"></i>\n </a>\n </div>\n </div>\n\n <div class="md_modal_body">\n\n <div class="md_modal_sections">\n\n <div class="md_modal_versioned_section_wrap" ng-if="canShowVersion(\'0.5.5\')">\n <div class="md_modal_section_version">0.5.5</div>\n <div class="md_modal_section_description changelog_version_changes">\n <ul class="list-unstyled changelog_version_changes_list">\n <li>Introducing Drafts: Seamless syncing for unsent messages on all your devices. Drafts are now visible in your chats list.</li>\n <li>Mention people in groups by typing @ and selecting them from the list — even if they don\'t have a username.</li>\n <li>Share links to specific posts in channels via quick forwarding menu (click on the date in a message to try this out).</li>\n </ul>\n\n </div>\n </div>\n\n <div class="md_modal_versioned_section_wrap" ng-if="canShowVersion(\'0.5.4\')">\n <div class="md_modal_section_version">0.5.4</div>\n <div class="md_modal_section_description changelog_version_changes">\n <ul class="list-unstyled changelog_version_changes_list">\n <li>Introducing Bot API 2.0, the biggest update to our bot platform since June 2015.</li>\n <li>New inline keyboards with callback, \'open URL\' or \'switch to inline mode\' buttons help create seamless interfaces.</li>\n <li>Bots can now update existing messages on the fly as you interact with them.</li>\n <li>Prepare for the rise of location-based bots: all bots can now ask users to share their location.</li>\n <li>Inline bots can now send all attachments supported in Telegram (videos, music, stickers, files, etc.).</li>\n <li>Try out these sample bots to see what\'s coming your way soon: @music, @sticker, @youtube, @foursquare</li>\n <li>Check out the <a href="https://telegram.org/blog/bots-2-0" target="_blank">Telegram Blog</a> for more info.</li>\n <li>New quick forwarding in channels (click on the date in a message to try this out).</li>\n <li>Improved performance.</li>\n </ul>\n\n </div>\n </div>\n\n <div class="md_modal_versioned_section_wrap" ng-if="canShowVersion(\'0.5.3\')">\n <div class="md_modal_section_version">0.5.3</div>\n <div class="md_modal_section_description changelog_version_changes">\n <ul class="list-unstyled changelog_version_changes_list">\n <li>Inline bots: A new way to add bot content to any chat. Type a bot\' s username and your query in the text field to get instant results and send them to your chat partner . Try typing < code > @ gif dog < / c o d e > i n y o u r n e x t c h a t . S a m p l e b o t s : @ g i f , @ w i k i , @ b i n g , @ v i d , @ b o l d . < / l i > \ n < l i > C h e c k o u t t h e < a h r e f = " h t t p s : / / t e l e g r a m . o r g / b l o g / i n l i n e - b o t s " t a r g e t = " _ b l a n k " > T e l e g r a m B l o g < / a > f o r m o r e i n f o . < / l i > \ n < l i > I m p r o v e d G I F s : 2 0 x f a s t e r s e n d i n g a n d d o w n l o a d i n g , n i c e a n i m a t e d p r o g r e s s
e . put ( "partials/desktop/chat_modal.html" , '<div class="chat_modal_wrap md_modal_wrap" my-modal-position>\n\n <div class="md_modal_head">\n <div class="md_modal_title_wrap">\n <div class="md_modal_actions_wrap clearfix">\n <a class="md_modal_action md_modal_action_close" ng-click="$close()" my-i18n="modal_close"></a>\n <a class="md_modal_action" ng-if="hasRights(\'edit_title\')" ng-click="editTitle()" my-i18n="modal_edit"></a>\n </div>\n <div class="md_modal_title" my-i18n="group_modal_info"></div>\n </div>\n\n <div class="peer_modal_profile_wrap clearfix">\n <div class="peer_modal_photo_wrap pull-left" ng-switch="photo.updating">\n <div ng-switch-when="true" class="peer_modal_photo md_photo_loading loading_dots">\n <i></i><i></i><i></i>\n </div>\n <a ng-switch-default ng-click="openPhoto(chatFull.chat_photo.id, {p: -chatFull.chat.id})" class="peer_modal_photo" my-peer-photolink="::-chatFull.chat.id" img-class="peer_modal_photo" no-open="true" watch="true" ng-class="{disabled: !chatFull.chat.photo.photo_small}" ng-disabled="!chatFull.chat.photo.photo_small"></a>\n </div>\n <div class="peer_modal_profile">\n <div class="peer_modal_profile_name" my-peer-link="-chatFull.chat.id"></div>\n <div class="peer_modal_profile_description" ng-if="chatFull.chat.participants_count > 0">\n <ng-pluralize count="chatFull.chat.participants_count"\n when="group_modal_pluralize_participants">\n </ng-pluralize>\n </div>\n </div>\n </div>\n </div>\n\n <div class="md_modal_split_actions_wrap">\n <div class="md_modal_split_actions">\n <div class="md_modal_split_action">\n <input my-file-upload type="file" multiple="false" class="im_attach_input" size="120" multiple="false" accept="image/x-png, image/png, image/gif, image/jpeg" title="{{\'group_modal_update_photo\' | i18n}}" />\n <i class="md_modal_split_action_camera"></i>\n </div>\n </div>\n </div>\n\n <div class="md_modal_body">\n\n <div class="md_modal_sections clearfix">\n\n <div class="md_modal_iconed_section_wrap md_modal_iconed_section_link" ng-if="hasRights(\'invite\') && chatFull.participants.participants.length < maxParticipants">\n <i class="md_modal_section_icon md_modal_section_icon_person"></i>\n\n <div class="md_modal_section_link_wrap">\n <a class="md_modal_section_link" ng-click="inviteToGroup()" my-i18n="group_modal_add_member"></a>\n </div>\n\n </div>\n\n <div class="md_modal_iconed_section_wrap md_modal_iconed_section_link" ng-if="chatFull.chat._ != \'chatForbidden\' && !chatFull.chat.pFlags.left && chatFull.chat.pFlags.creator">\n\n <div class="md_modal_section_link_wrap">\n <a class="md_modal_section_link" ng-click="inviteViaLink()" my-i18n="group_modal_menu_share_link"></a>\n </div>\n\n </div>\n\n <div class="md_modal_iconed_section_wrap md_modal_iconed_section_toggle">\n <i class="md_modal_section_icon md_modal_section_icon_notification"></i>\n\n <a class="md_modal_section_toggle_wrap tg_checkbox" ng-click="settings.notifications = !settings.notifications" ng-class="settings.notifications ? \'tg_checkbox_on\' : \'\' ">\n <span class=" icon icon - checkbox - outer "><i class=" icon - checkbox - inner "></i></span>\n <span class=" tg _checkbox _label " my-i18n=" group _modal _notifications "></span>\n </a>\n\n </div>\n\n <div class=" md _modal _iconed _section _wrap md _modal _iconed _section _link ">\n <i class=" md _modal _section _icon md _modal _section _icon _more "></i>\n\n <div class=" md _modal _section _link _wrap ">\n <a class=" md _modal _section _link " ng-click=" flushHistory ( true ) " my-i18n=" group _modal _menu _clear _history "></a>\n </div>\n\n </div>\n\n <div class=" md _modal _iconed _section _wrap md _modal _iconed _section _link " ng-if=" chatFull . chat . pFlags . creator ">\n\n <div class=" md _modal _section _link _wrap ">\n <a class=" md _modal _section _link " ng - c
e . put ( "partials/desktop/footer.html" , '<div class="footer_wrap" ng-controller="AppFooterController">\n\t<a class="footer_link" href="https://telegram.org" target="_blank" my-i18n="head_about"></a>\n <a class="footer_link" ng-click="openSettings()" my-i18n="im_settings"></a>\n <a class="footer_link" href="https://twitter.com/telegram_web" target="_blank" my-i18n="footer_twitter"></a>\n</div>' ) , e . put ( "partials/desktop/forwarded_messages.html" , '<div class="im_message_reply clearfix" ng-class="{im_message_reply_thumbed: thumb !== false}">\n <div class="im_message_reply_border"></div>\n <div class="im_message_reply_thumb_wrap pull-left" ng-if="thumb !== false">\n <img\n class="im_message_reply_thumb"\n my-load-thumb\n thumb="thumb"\n watch="true"\n />\n </div>\n <div class="im_message_reply_author">\n <span my-peer-link="fromID" peer-watch="true"></span>\n </div>\n <div class="im_message_reply_body" ng-switch="singleMessage !== false">\n <div ng-switch-when="true">\n <span my-short-message="singleMessage"></span>\n </div>\n <div ng-switch-default>\n <span class="im_reply_message_service">\n <ng-pluralize count="count"\n when="im_X_forwarded_messages">\n </ng-pluralize>\n </span>\n </div>\n </div>\n</div>' ) , e . put ( "partials/desktop/full_document.html" , '<div class="document_modal_image_wrap">\n <div class="img_fullsize_with_progress_wrap document_fullsize_with_progress_wrap" ng-style="{width: frameWidth + \'px\', height: frameHeight + \'px\'}">\n <div class="img_fullsize_progress_overlay">\n <div class="img_fullsize_progress_wrap" ng-style="{width: frameWidth + \'px\', height: frameHeight + \'px\'}">\n <div class="img_fullsize_progress progress tg_progress">\n <div class="progress-bar progress-bar-success" style="width: {{document.progress.percent}}%"></div>\n </div>\n </div>\n </div>\n <div class="img_fullsize_wrap" ng-if="thumbSrc.length > 0">\n <img\n class="img_fullsize"\n ng-src="{{thumbSrc}}"\n ng-style="{width: imageWidth + \'px\', height: imageHeight + \'px\'}"\n />\n </div>\n </div>\n <div class="document_fullsize_wrap" ng-click="toggleZoom(!zoomed)">\n <img class="document_fullsize_img" />\n </div>\n</div>' ) , e . put ( "partials/desktop/full_gif.html" , '<a class="img_gif_with_progress_wrap" ng-click="toggle($event)">\n\n <div class="img_gif_image_wrap">\n\n <div class="img_gif_meta" ng-show="!isActive" ng-switch="document.progress.enabled">\n <div ng-switch-when="true" class="img_gif_meta_contents">\n <i class="icon icon-cancel">\n <i class="icon icon-bar"></i>\n <i class="icon icon-bar"></i>\n </i>\n <div my-arc-progress="document.progress.percent"></div>\n </div>\n <div ng-switch-default class="img_gif_label noselect img_gif_meta_contents"><span class="copyonly">[</span>GIF<span class="copyonly">]</span></div>\n </div>\n\n <div ng-if="document.url" ng-show="document.downloaded && isActive" ng-switch="document.mime_type == \'video/mp4\'">\n <video ng-switch-when="true" width="{{document.thumb.width}}" height="{{document.thumb.height}}" loop autoplay class="img_gif_video">\n <source ng-src="{{document.url}}" type="video/mp4">\n </video>\n <img ng-switch-default class="img_gif_image" ng-src="{{document.url}}" width="{{document.thumb.width}}" height="{{document.thumb.height}}" />\n </div>\n <img ng-hide="document.downloaded && isActive" class="img_gif_thumb" my-load-thumb thumb="document.thumb" />\n\n </div>\n\n</a>' ) , e . put ( "partials/desktop/full_photo.html" , '<div class="img_fullsize_with_progress_wrap">\n <div class="img_fullsize_progress_overlay" ng-show="progress.enabled">\n <div class="img_fullsize_progress_wrap">\n <div class="img_fullsize_progress progress tg_progress" ng-show="progress.percent > 0">\n <div class="progress-bar progress-bar-success" ng-style="{width: progress.percent + \'%\' } " > \ n < /div>\n </
e . put ( "partials/desktop/lang_footer.html" , '<div class="footer_wrap" ng-controller="AppLangSelectController">\n\t<span ng-repeat="locale in ::supportedLocales">\n\t <a class="footer_lang_link" ng-class="{active: curLocale == locale, disabled: curLocale == locale}" ng-disabled="curLocale == locale" ng-click="localeSelect(locale)" ng-bind="langNames[locale]"></a>\n\t <span ng-if="!$last" class="footer_link_divider"></span>\n\t</span>\n</div>' ) , e . put ( "partials/desktop/login.html" , '<div class="login_page_wrap" my-custom-background="#e7ebf0">\n <div class="login_head_bg"></div>\n <div class="login_page">\n <div class="login_head_wrap clearfix" ng-switch="progress.enabled">\n <div ng-switch-when="true" class="login_head_submit_progress">\n <my-i18n ng-if="!credentials.phone_code_hash" msgid="login_generating_key"></my-i18n><my-i18n ng-if="credentials.phone_code_hash && !credentials.phone_code_valid" msgid="login_checking_code"></my-i18n><my-i18n ng-if="credentials.phone_code_valid && credentials.phone_unoccupied" msgid="login_signing_up"></my-i18n><my-i18n ng-if="credentials.phone_code_valid && credentials.password_needed" msgid="login_checking_password"></my-i18n><span my-loading-dots></span>\n </div>\n <div ng-switch-default class="login_head_submit_wrap">\n <a class="login_head_submit_btn" ng-if="!credentials.phone_code_hash" ng-click="sendCode()">\n <my-i18n msgid="modal_next"></my-i18n><i class="icon icon-next-submit"></i>\n </a>\n <a class="login_head_submit_btn" ng-if="credentials.phone_code_hash && !credentials.phone_code_valid" ng-click="logIn()">\n <my-i18n msgid="modal_next"></my-i18n><i class="icon icon-next-submit"></i>\n </a>\n <a class="login_head_submit_btn" ng-if="credentials.phone_code_valid && credentials.phone_unoccupied" ng-click="logIn(true)">\n <my-i18n msgid="modal_next"></my-i18n><i class="icon icon-next-submit"></i>\n </a>\n <a class="login_head_submit_btn" ng-if="credentials.phone_code_valid && credentials.password_needed" ng-click="checkPassword()">\n <my-i18n msgid="modal_next"></my-i18n><i class="icon icon-next-submit"></i>\n </a>\n </div>\n <a class="login_head_logo_link" href="https://telegram.org" target="_blank">\n <i class="icon icon-tg-logo"></i><i class="icon icon-tg-title"></i>\n </a>\n </div>\n\n <div class="login_form_wrap">\n <div class="error" ng-if="error.message" ng-bind="error.message"></div>\n\n <form name="mySendCodeForm" ng-if="!credentials.phone_code_hash" ng-submit="sendCode()">\n <h3 class="login_form_head" my-i18n="login_sign_in"></h3>\n <p class="login_form_lead" my-i18n="login_enter_number_description"></p>\n\n <div class="md-input-group md-input-has-value login_phone_country_input_group" ng-click="chooseCountry()">\n <label class="md-input-label" my-i18n="login_country_select_placeholder"></label>\n <div autocomplete="off" class="md-input"ng-bind="credentials.phone_country_name"></div>\n </div>\n\n <div class="login_phone_groups_wrap clearfix">\n\n <div class="md-input-group login_phone_code_input_group" ng-class="{\'md-input-error\': error.field == \'phone\'}" my-labeled-input>\n <label class="md-input-label" my-i18n="login_code_input_placeholder"></label>\n <input autocomplete="off" class="md-input" my-focused name="phone_country" type="tel" ng-model="credentials.phone_country" />\n </div>\n\n <div class="md-input-group login_phone_num_input_group" ng-class="{\'md-input-error\': error.field == \'phone\'}" my-labeled-input ng-switch="error.field == \'phone\' ">\n <label ng-switch-when=" true " class=" md - input - label " my-i18n=" login _incorrect _number "></label>\n <label ng-switch-default class=" md - input - label " my-i18n=" login _tel _input _placeholder "></label>\n <input required autocomplete=" off " my-submit-on-enter class=" md - input " my-focus-on=" co
e . put ( "partials/desktop/password_recovery_modal.html" , '<div class="md_simple_modal_wrap" my-modal-position>\n\n <div class="md_simple_modal_body">\n\n <form class="modal_simple_form" ng-submit="checkCode()">\n\n <h4 my-i18n="login_recovery_title"></h4>\n\n <div class="md_simple_form_description" my-i18n="login_recovery_description_md">\n <my-i18n-param name="email">\n <strong ng-bind="recovery.email_pattern"></strong>\n </my-i18n-param>\n </div>\n\n <div class="md-input-group" ng-class="{\'md-input-error\': recovery.error_field == \'code\'}" my-labeled-input ng-switch="recovery.error_field == \'code\'">\n <label ng-switch-when="true" class="md-input-label" my-i18n="login_code_incorrect"></label>\n <label ng-switch-default class="md-input-label" my-i18n="login_code_placeholder"></label>\n <input class="md-input" my-focused type="text" ng-model="recovery.code" name="code" my-focused />\n </div>\n\n </form>\n\n </div>\n\n <div class="md_simple_modal_footer">\n\n <button class="btn btn-md" ng-click="$dismiss()" my-i18n="modal_cancel"></button>\n <button class="btn btn-md btn-md-primary" ng-class="{disabled: recovery.updating}" ng-click="checkCode()" ng-disabled="recovery.updating" ng-bind="recovery.updating ? \'password_recover_active\' : \'password_recover_submit\' | i18n"></button>\n\n </div>\n\n</div>' ) , e . put ( "partials/desktop/password_update_modal.html" , '<div class="md_simple_modal_wrap" my-modal-position>\n\n <div class="md_simple_modal_body">\n\n <form class="modal_simple_form" ng-submit="updatePassword()">\n\n <h4 ng-switch="action">\n <my-i18n ng-switch-when="disable" msgid="password_delete_title"></my-i18n>\n <my-i18n ng-switch-default msgid="password_change_title"></my-i18n>\n </h4>\n\n <div ng-if="password._ != \'account.noPassword\'" class="md-input-group" ng-class="{\'md-input-error\': passwordSettings.error_field == \'cur_password\'}" my-labeled-input>\n <label class="md-input-label" my-i18n="password_current_placeholder"></label>\n <input class="md-input" my-focused type="password" ng-model="passwordSettings.cur_password" name="cur_password" my-focus-on="cur_password_focus" />\n </div>\n\n <div ng-if="action != \'disable\'" class="md-input-group md-input-grouped" ng-class="{\'md-input-error\': passwordSettings.error_field == \'new_password\'}" my-labeled-input>\n <label class="md-input-label" my-i18n="password_new_placeholder"></label>\n <input class="md-input" type="password" ng-model="passwordSettings.new_password" name="new_password" my-focus-on="new_password_focus" />\n </div>\n\n <div ng-if="action != \'disable\'" class="md-input-group" ng-class="{\'md-input-error\': passwordSettings.confirm_password && passwordSettings.new_password && passwordSettings.confirm_password != passwordSettings.new_password}" my-labeled-input>\n <label class="md-input-label" my-i18n="password_confirm_placeholder"></label>\n <input class="md-input" type="password" ng-model="passwordSettings.confirm_password" name="confirm_password" my-focus-on="confirm_password_focus" />\n </div>\n\n <div ng-if="action != \'disable\'" class="md-input-group" my-labeled-input>\n <label class="md-input-label" my-i18n="password_hint_placeholder"></label>\n <input class="md-input" type="text" ng-model="passwordSettings.hint" name="hint" />\n </div>\n\n <div ng-if="action != \'disable\'" class="md_simple_form_description" my-i18n="password_create_description"></div>\n\n <div ng-if="action != \'disable\'" class="md-input-group" ng-class="{\'md-input-error\': passwordSettings.error_field == \'email\' } " my-labeled-input>\n <label class=" md - input - label " my-i18n=" password _email _placeholder "></label>\n <input class=" md - input " type=" text " ng-model=" passwordSettings . email " name=" email " />\n </div>\n\n\n </form>\n\n </div>\n\n <div class=" md _simple _modal _footer ">\n\n <button class=" btn btn - md " ng-click=" $dismiss ( ) " my
e . put ( "partials/desktop/user_modal.html" , '<div class="user_modal_wrap md_modal_wrap" my-modal-position>\n\n <div class="md_modal_head">\n <div class="md_modal_title_wrap">\n <div class="md_modal_actions_wrap clearfix">\n <a class="md_modal_action md_modal_action_close" ng-click="$close()" my-i18n="modal_close"></a>\n <a class="md_modal_action" ng-if="user.pFlags.contact" ng-click="importContact(true)" my-i18n="modal_edit"></a>\n </div>\n <div class="md_modal_title" my-i18n="user_modal_contact_info"></div>\n </div>\n\n <div class="peer_modal_profile_wrap clearfix">\n <div class="peer_modal_photo_wrap pull-left">\n <a ng-click="openPhoto(user.photo.photo_id, {p: user.id})" class="peer_modal_photo" ng-class="{disabled: !user.photo.photo_id}" ng-disabled="!user.photo.photo_id" my-peer-photolink="::user.id" img-class="peer_modal_photo" no-open="true"></a>\n </div>\n <div class="peer_modal_profile">\n <div class="peer_modal_profile_name" my-peer-link="user.id" verified="true"></div>\n <div class="peer_modal_profile_description" my-user-status="::user.id"></div>\n </div>\n </div>\n </div>\n\n <div class="md_modal_split_actions_wrap">\n <div class="md_modal_split_actions">\n <a class="md_modal_split_action" href="" ng-click="goToHistory()" title="{{\'user_modal_send_message\' | i18n}}">\n <i class="md_modal_split_action_msg"></i>\n </a>\n </div>\n </div>\n\n\n <div class="md_modal_body">\n\n <div class="md_modal_sections clearfix">\n\n <div class="md_modal_iconed_section_wrap md_modal_iconed_section_number" ng-if="user.phone || user.username || rAbout">\n <i class="md_modal_section_icon md_modal_section_icon_phone"></i>\n\n <div class="md_modal_section_param_wrap" ng-if="user.phone">\n <div class="md_modal_section_param_value" ng-bind="user.phone | phoneNumber"></div>\n <div class="md_modal_section_param_name" my-i18n="user_modal_phone"></div>\n </div>\n\n <div class="md_modal_section_param_wrap" ng-if="user.username">\n <div class="md_modal_section_param_value">\n <span ng-bind="\'@\' + user.username"></span>\n </div>\n <div class="md_modal_section_param_name" my-i18n="user_modal_username"></div>\n </div>\n\n <div class="md_modal_section_param_wrap" ng-if="rAbout">\n <div class="md_modal_section_param_value">\n <span ng-bind-html="rAbout"></span>\n </div>\n <div class="md_modal_section_param_name" my-i18n="user_modal_about"></div>\n </div>\n </div>\n\n <div class="md_modal_iconed_section_wrap md_modal_iconed_section_toggle">\n <i class="md_modal_section_icon md_modal_section_icon_notification"></i>\n\n <a class="md_modal_section_toggle_wrap tg_checkbox" ng-click="settings.notifications = !settings.notifications" ng-class="settings.notifications ? \'tg_checkbox_on\' : \'\'">\n <span class="icon icon-checkbox-outer"><i class="icon-checkbox-inner"></i></span>\n <span class="tg_checkbox_label" my-i18n="user_modal_notifications"></span>\n </a>\n\n </div>\n\n <div class="md_modal_iconed_section_wrap md_modal_iconed_section_link" ng-init="f.showMoreActions = !user.phone.length">\n <i class="md_modal_section_icon md_modal_section_icon_more"></i>\n\n <div class="md_modal_section_link_wrap" ng-if="user.pFlags.bot && !user.pFlags.bot_nochats">\n <a class="md_modal_section_link" ng-click="inviteToGroup()" my-i18n="user_modal_add_to_group"></a>\n </div>\n\n <div class="md_modal_section_link_wrap" ng-if="bot_info.commands.settings != null">\n <a class="md_modal_section_link" ng-click="sendCommand(\'settings\')" my-i18n="user_modal_bot_settings"></a>\n </div>\n\n <div class="md_modal_section_link_wrap" ng-if="bot_info.commands.help != null">\n <a class="md_modal_section_link" ng-click="sendCommand(\'help\' ) " my-i18n=" user _modal _bot _help " > < / a > \ n
e . put ( "partials/mobile/channel_modal.html" , '<div class="chat_modal_wrap">\n\n <div class="tg_page_head tg_modal_head">\n <div class="navbar navbar-static-top navbar-inverse">\n <div class="container">\n\n <div class="navbar-toggle-wrap dropdown" dropdown ng-if="chatFull.chat.pFlags.creator || !chatFull.chat.pFlags.left && !chatFull.chat.pFlags.kicked">\n <a class="dropdown-toggle navbar-toggle" dropdown-toggle>\n <span class="icon-bar"></span>\n <span class="icon-bar"></span>\n <span class="icon-bar"></span>\n </a>\n <ul class="dropdown-menu">\n <li ng-if="hasRights(\'edit_photo\')">\n <a ng-click="deletePhoto()" my-i18n="group_modal_menu_delete_photo"></a>\n </li>\n <li ng-if="hasRights(\'edit_title\')">\n <a ng-click="editChannel()" my-i18n="modal_edit"></a>\n </li>\n <li ng-if="chatFull.chat.pFlags.creator">\n <a ng-click="deleteChannel()" my-i18n="channel_modal_delete_channel"></a>\n </li>\n <li ng-if="!chatFull.chat.pFlags.creator && !chatFull.chat.pFlags.left && !chatFull.chat.pFlags.kicked">\n <a ng-click="leaveChannel()" my-i18n="group_modal_menu_leave"></a>\n </li>\n </ul>\n </div>\n\n <div class="navbar-header">\n\n <ul class="nav navbar-nav navbar-quick-nav">\n <li>\n <a ng-click="$close()" class="navbar-quick-media-back">\n <i class="icon icon-back"></i>\n <div class="navbar-quick-back-title">\n <h4 my-i18n="channel_modal_info"></h4>\n </div>\n </a>\n </li>\n </ul>\n\n </div>\n\n </div>\n </div>\n </div>\n\n <div class="modal-body mobile_modal_body">\n\n <div class="mobile_user_modal_photo_profile_wrap">\n\n <a ng-click="openPhoto(chatFull.chat_photo.id, {p: -chatFull.chat.id})" class="mobile_user_modal_image_wrap pull-left" my-peer-photolink="::-chatFull.chat.id" img-class="mobile_user_modal_image mobile_chat_modal_image" no-open="true" watch="true" ng-class="{disabled: !chatFull.chat.photo.photo_small}" ng-disabled="!chatFull.chat.photo.photo_small"></a>\n\n <div class="mobile_user_modal_info_wrap clearfix">\n <h4 class="mobile_user_modal_header" my-peer-link="-chatFull.chat.id" verified="true"></h4>\n <p class="mobile_user_modal_status" ng-if="chatFull.participants_count > 0">\n <ng-pluralize count="chatFull.participants_count"\n when="group_modal_pluralize_participants">\n </ng-pluralize>\n </p>\n </div>\n\n </div>\n\n <div class="mobile_modal_section" ng-if="chatFull.rAbout">\n <h4 class="mobile_modal_section_header" my-i18n="channel_modal_description"></h4>\n <div class="mobile_modal_section_value" ng-bind-html="chatFull.rAbout"></div>\n </div>\n\n <div class="mobile_modal_section" ng-if="chatFull.chat.username || chatFull.chat.pFlags.creator">\n <h4 class="mobile_modal_section_header" my-i18n="channel_modal_share_link"></h4>\n <div class="mobile_modal_section_value" ng-switch="chatFull.chat.username.length > 0">\n <a ng-switch-when="true" class="settings_modal_username_link" ng-click="shareLink($event)" ng-bind="\'https://telegram.me/\' + chatFull.chat.username" ng-href="https://telegram.me/{{chatFull.chat.username}}" target="_blank"></a>\n <a ng-switch-default ng-click="shareLink($event)" ng-bind="chatFull.exported_invite.link" ng-href="{{chatFull.exported_invite.link}}" target="_blank"></a>\n </div>\n </div>\n\n <div class="mobile_modal_action_wrap" ng-if="hasRights(\'invite\' ) ">\n <a class=" mobile _modal _action " ng-click=" inviteToChannel ( ) " my-i18n=" channel _modal _add _member "></a>\n </div>\n\n <div class=" mobile _modal _action _wrap " ng-if=" chatFull . chat . pFlags . left ">\n <a class=" mobile _modal _action " ng-click=" joinChannel ( ) " my-i18n=" channel _modal _join " > < / a > \ n < / d i v > \
e . put ( "partials/mobile/im.html" , '<div my-head></div>\n\n<div class="im_page_wrap" ng-class="{im_page_peer_not_selected: !curDialog.peer}">\n\n <div class="im_page_split clearfix">\n\n <div ng-controller="AppImDialogsController" my-dialogs class="im_dialogs_col_wrap" ng-class="search.query.length > 0 ? \'im_dialogs_col_search\' : \'\'">\n <div class="im_dialogs_panel">\n <div class="im_dialogs_search">\n <input class="form-control im_dialogs_search_field no_outline" type="search" placeholder="{{\'modal_search\' | i18n}}" ng-model="search.query" autocomplete="off" />\n <a class="im_dialogs_search_clear tg_search_clear" ng-click="searchClear()" ng-show="search.query.length">\n <i class="icon icon-search-clear"></i>\n </a>\n </div>\n </div>\n\n <div my-dialogs-list-mobile class="im_dialogs_col im_dialogs_scrollable_wrap mobile_scrollable_wrap">\n\n <div class="im_dialogs_empty_wrap" ng-if="isEmpty.contacts" my-vertical-position="0.4">\n <h3 class="im_dialogs_empty_header" my-i18n="im_no_contacts"></h3>\n <p class="im_dialogs_empty_lead" my-i18n="im_get_started_long"></p>\n <button type="button" class="btn btn-primary btn-block im_dialogs_add_contact" ng-click="importContact()" my-i18n="im_add_contact"></button>\n <button ng-if="phonebookAvailable" type="button" class="btn btn-primary btn-block im_dialogs_import_phonebook" ng-click="importPhonebook()" my-i18n="im_import_phonebook"></button>\n </div>\n\n <ul class="nav nav-pills nav-stacked">\n <li class="im_dialog_wrap" my-dialog dialog-message="dialogMessage" ng-repeat="dialogMessage in dialogs track by dialogMessage.peerID" ng-class="{active: curDialog.peerID == dialogMessage.peerID}"></li>\n </ul>\n\n <div class="im_dialogs_contacts_wrap" ng-show="contacts.length > 0">\n <h5 my-i18n="im_contacts_title"></h5>\n <ul class="nav nav-pills nav-stacked">\n <li class="im_dialog_wrap" ng-repeat="contact in contacts | orderBy:\'user.sortName\' track by contact.userID" ng-class="{active: curDialog.peerID == contact.userID}">\n <a class="im_dialog" ng-mousedown="dialogSelect(contact.peerString)">\n <div class="im_dialog_photo pull-left" my-peer-photolink="contact.userID" img-class="im_dialog_photo" watch="true"></div>\n <div class="im_dialog_message_wrap">\n <div class="im_dialog_peer">\n <span class="im_dialog_user" my-peer-link="contact.userID" verified="true"></span>\n </div>\n <div class="im_dialog_message">\n <span class="im_dialog_message_text" my-user-status="::contact.userID"></span>\n </div>\n </div>\n </a>\n </li>\n </ul>\n </div>\n\n <div class="im_dialogs_contacts_wrap" ng-show="foundPeers.length > 0">\n <h5 my-i18n="im_found_title"></h5>\n <ul class="nav nav-pills nav-stacked">\n <li class="im_dialog_wrap" ng-repeat="foundPeer in foundPeers track by foundPeer.id" ng-class="{active: curDialog.peerID == foundPeer.id}">\n <a class="im_dialog" ng-mousedown="dialogSelect(foundPeer.peerString)">\n <div class="im_dialog_photo pull-left" my-peer-photolink="foundPeer.id" img-class="im_dialog_photo" watch="true"></div>\n <div class="im_dialog_message_wrap">\n <div class="im_dialog_peer">\n <span class="im_dialog_user" my-peer-link="foundPeer.id" verified="true"></span>\n </div>\n <div class="im_dialog_message">\n <span class="im_dialog_message_text" ng-bind="::\'@\' + foundPeer . username "></span>\n </div>\n </div>\n </a>\n </li>\n </ul>\n </div>\n\n <div class=" im _dialogs _messages _wrap " ng-show=" foundMessages . length > 0 ">\n <h5 my-i18n=" im _messages " > <
e . put ( "partials/mobile/message_attach_geo.html" , '<a ng-href="{{::media.mapUrl}}" target="_blank" class="im_message_geopoint">\n <i class="icon icon-geo-point"></i>\n <img\n class="im_message_venue_geopoint_image"\n my-geo-point-map="media.geo"\n width="200"\n height="100"\n />\n</a>' ) , e . put ( "partials/mobile/message_attach_pending.html" , '<div class="im_message_document im_message_upload_file" ng-class="::\'im_message_upload_\' + media.type">\n <div class="im_message_file_button im_message_file_button_upload">\n <i class="im_message_file_button_icon"></i>\n </div>\n <div class="im_message_document_info">\n <div class="im_message_document_name_wrap">\n <span class="im_message_document_name" ng-bind="::media.file_name"></span>\n <span class="im_message_document_size" ng-if="media.progress" ng-bind="media.progress | formatSizeProgress"></span>\n </div>\n <div class="clearfix im_message_cancelable_progress_wrap">\n <a class="im_message_media_progress_cancel pull-right" ng-click="media.progress.cancel()" my-i18n="modal_cancel"></a>\n <div class="im_message_download_progress_wrap">\n <div class="progress tg_down_progress">\n <div class="progress-bar progress-bar-success" role="progressbar" ng-style="{width: media.progress.percent + \'%\'}"></div>\n </div>\n </div>\n </div>\n </div>\n</div>\n' ) , e . put ( "partials/mobile/message_attach_photo.html" , '<a class="im_message_photo_thumb" ng-click="openPhoto(media.photo.id, {m: messageId})" ng-style="::{width: media.photo.thumb.width + \'px\'}" ng-mouseover="preloadPhoto(media.photo.id)">\n <img\n class="im_message_photo_thumb"\n my-load-thumb\n thumb="media.photo.thumb"\n />\n</a>\n<div ng-if="::media.rCaption" class="im_message_photo_caption" ng-bind-html="::media.rCaption"></div>' ) , e . put ( "partials/mobile/message_attach_venue.html" , '<div class="im_message_venue clearfix">\n\n <a ng-href="{{::media.mapUrl}}" target="_blank" class="im_message_venue_geopoint_wrap">\n <i class="icon icon-geo-point"></i>\n <img\n class="im_message_venue_geopoint_image"\n my-geo-point-map="media.geo"\n width="100"\n height="100"\n alt="[{{::\'conversation_media_location\' | i18n}} {{::media.mapUrl}}]"\n />\n </a>\n\n <div class="im_message_venue_info">\n <div class="im_message_venue_title_wrap">\n <a ng-href="{{::media.mapUrl}}" target="_blank" class="im_message_document_name" ng-bind="::media.title"></a>\n </div>\n <div class="im_message_venue_address" ng-bind="::media.address"></div>\n </div>\n\n</div>\n' ) , e . put ( "partials/mobile/message_attach_webpage.html" , '<div ng-show="webpage._ == \'webPage\'" class="im_message_webpage_wrap clearfix" ng-switch="webpage.type">\n <div ng-switch-when="photo" class="im_message_webpage_photo">\n <div class="im_message_webpage_site" ng-bind="webpage.site_name || webpage.display_url"></div>\n <div class="im_message_webpage_title">\n <a href="{{webpage.url}}" target="_blank" ng-bind-html="webpage.rTitle"></a>\n </div>\n <div ng-if="webpage.description.length" class="im_message_webpage_description" ng-bind-html="webpage.rDescription"></div>\n <a class="im_message_photo_thumb" ng-click="openPhoto(webpage.photo.id, {w: webpage.id, m: messageId})" ng-style="::{width: webpage.photo.thumb.width + \'px\' } " ng-mouseover=" preloadPhoto ( webpage . photo . id ) ">\n <img\n class=" im _message _photo _thumb "\n my-load-thumb\n thumb=" webpage . photo . thumb "\n />\n </a>\n </div>\n <div ng-switch-when=" video " class=" im _message _webpage _video ">\n <div class=" im _message _webpage _site " ng-bind=" webpage . site _name || webpage . display _url "></div>\n <div class=" im _message _webpage _title ">\n <a ng-click=" openEmbed ( $event ) " href=" { { webpage . url } } " target=" _blank " ng-bind-html=" webpage . rTitle "></a>\n </div>\n <div ng-if=" webpage . description . length " class=" im _message _webpage _description " ng-bind-html=" webpage . rDescription "></div>\n <a class=" im _message _video _thumb " ng-click=" openEmbed ( $event ) " ng-href=" { { w
e . put ( "partials/mobile/stickerset_modal.html" , '<div class="stickerset_modal_wrap">\n\n <div class="tg_page_head tg_modal_head">\n <div class="navbar navbar-static-top navbar-inverse">\n <div class="container">\n\n <div class="navbar-header">\n\n <ul class="nav navbar-nav navbar-quick-nav">\n <li class="navbar-quick-right" ng-if="stickersetLoaded" ng-switch="stickersetInstalled">\n <a ng-switch-when="true" my-i18n="stickerset_modal_uninstall" ng-click="toggleInstalled(false)"></a>\n <a ng-switch-when="false" my-i18n="stickerset_modal_install" ng-click="toggleInstalled(true)"></a>\n </li>\n <li>\n <a ng-click="$dismiss()" class="navbar-quick-media-back">\n <i class="icon icon-back"></i>\n <div class="navbar-quick-back-title">\n <h4 ng-switch="!stickersetLoaded">\n <span ng-switch-when="true" my-i18n="stickerset_modal_title_loading"></span>\n <span ng-switch-default ng-bind="stickerset.title"></span>\n </h4>\n </div>\n </a>\n </li>\n </ul>\n\n </div>\n\n </div>\n </div>\n </div>\n\n <div class="modal-body">\n\n <div my-stickers-list class="stickerset_modal_col">\n\n <div class="stickerset_wrap nano" my-infinite-scroller>\n <div class="stickerset_scrollable_wrap nano-content" ng-switch="!stickersetLoaded">\n\n <div ng-switch-when="true" class="stickerset_modal_loading" my-vertical-position="0.2" padding="true" my-i18n="stickerset_modal_loading">\n <my-i18n-param name="dots">\n <span my-loading-dots></span>\n </my-i18n-param>\n </div>\n\n <div ng-switch-default class="stickerset_modal_stickers_list clearfix">\n <div class="stickerset_modal_sticker_wrap" ng-repeat="sticker in documents | limitTo: slice.limit">\n <div class="stickerset_modal_sticker" my-load-sticker document="sticker" thumb="true"></div>\n <div class="stickerset_modal_sticker_alt" ng-bind-html="sticker.stickerEmoji"></div>\n </div>\n </div>\n\n </div>\n </div>\n\n </div>\n\n </div>\n\n</div>' ) , e . put ( "partials/mobile/user_modal.html" , ' < div class = "mobile_user_modal_wrap" > \ n \ n < div class = "tg_page_head tg_modal_head" > \ n < div class = "navbar navbar-static-top navbar-inverse" > \ n < div class = "container" > \ n \ n < div class = "navbar-toggle-wrap dropdown" dropdown > \ n < a class = "dropdown-toggle navbar-toggle" dropdown - toggle > \ n < span class = "icon-bar" > < / s p a n > \ n < s p a n c l a s s = " i c o n - b a r " > < / s p a n > \ n < s p a n c l a s s = " i c o n - b a r " > < / s p a n > \ n < / a > \ n < u l c l a s s = " d r o p d o w n - m e n u " > \ n < l i n g - i f = " u s e r . p F l a g s . c o n t a c t " > \ n < a n g - c l i c k = " i m p o r t C o n t a c t ( t r u e ) " m y - i 1 8 n = " u s e r _ m o d a l _ e d i t _ c o n t a c t " > < / a > \ n < / l i > \ n < l i n g - i f = " u s e r . p F l a g s . c o n t a c t " > \ n < a n g - c l i c k = " d e l e t e C o n t a c t ( ) " m y - i 1 8 n = " u s e r _ m o d a l _ d e l e t e _ c o n t a c t " > < / a > \ n < / l i > \ n < l i n g - i f = " u s e r . p h o n e . l e n g t h > 0 & a m p ; & a m p ; ! u s e r . p F l a g s . c o n t a c t & a m p ; & a m p ; ! u s e r . p F l a g s . s e l f " > \ n < a n g - c l i c k = " i m p o r t C o n t a c t ( ) " m y - i 1 8 n = " u s e r _ m o d a l _ a d d _ c o n t a c t " > < / a > \ n < / l i > \ n < l i > \ n < a n g - c l i c k = " f l u s h H i s t o r y ( ) " m y - i 1 8 n = " u s e r _ m o d a l _ d e l e t e _ c h a t " > < / a > \ n < / l i > \ n < / u l > \ n < / d i v > \ n \ n < d i v c l a s s = " n a v b a r - h e a d e r " > \ n \ n < u l c l a s s = " n a v n a v b a r - n a v n a v b a r - q u i c k - n a v " > \ n < l i > \ n < a n g - c l i c k = " $ c l o s e ( ) " c l a s s = " n a v b a r - q u i c k - m e d i a - b a c k " > \ n < i c l a s s = " i c o n i c o n - b a c k " > < / i > \ n < d i v c l a s s = " n a v b a r - q u i c k - b a c k - t i t l e " > \ n < h 4 m y - i 1 8 n = " u s e r _ m o d a l _ c o n t a c t _ i n f o " > < / h 4 > \ n < / d i v > \ n < / a > \ n < / l i > \ n < / u l > \ n \ n < / d i v > \ n \ n < / d i v > \ n < / d i v > \ n < / d i v > \ n \ n < d i v c l a s s = " m o d a l - b o d y m o b i l e _ m o d a l _ b o d y " > \ n \ n < d i v c l a s s = " m o b i l e _ u s e r _ m o d a l _ p h o t o _ p r o f i l e _ w r a p " > \ n \ n
n . value = f , setFieldSelection ( n , _ ) } this . hideSuggestions ( ) , this . onChange ( ) } , MessageComposer . prototype . onMentionsUpdated = function ( e ) { delete this . previousQuery , this . isActive && this . checkAutocomplete ( ) } , MessageComposer . prototype . onMentionSelected = function ( e , t ) { var n = ! 0 ; if ( "#" == e . charAt ( 0 ) && ( n = ! 1 , e = e . substr ( 1 ) , t = t . replace ( /\(\)@/ , "" ) ) , this . richTextareaEl ) { var a = this . richTextareaEl [ 0 ] ; this . isActive || this . restoreSelection ( ) || setRichFocus ( a ) ; var i , o = getRichValueWithCaret ( a ) , s = o [ 0 ] , r = o [ 1 ] >= 0 ? o [ 1 ] : s . length , l = s . substr ( r ) , c = s . substr ( 0 , r ) , d = c . match ( /@([A-Za-z0-9\-\+\*_]*)$/ ) ; i = d && d [ 0 ] ? c . substr ( 0 , d . index ) + "@" + e : c + "@" + e ; var u ; n ? l . length ? ( this . selId = ( this . selId || 0 ) + 1 , u = this . getRichHtml ( i ) + ' <span id="composer_sel' + this . selId + '"></span>' + this . getRichHtml ( l ) , this . richTextareaEl . html ( u ) , setRichFocus ( a , $ ( "#composer_sel" + this . selId ) [ 0 ] ) ) : ( u = this . getRichHtml ( i ) + " " , this . richTextareaEl . html ( u ) , setRichFocus ( a ) ) : ( this . selId = ( this . selId || 0 ) + 1 , u = this . getRichHtml ( i ) + ' (<span id="composer_sel' + this . selId + '">' + encodeEntities ( t ) + "</span>) " + this . getRichHtml ( l ) , this . richTextareaEl . html ( u ) , setRichFocus ( a , $ ( "#composer_sel" + this . selId ) [ 0 ] , ! 0 ) ) } else { var i , p , m , g , a = this . textareaEl [ 0 ] , s = a . value , r = this . isActive ? getFieldSelection ( a ) : s . length , l = s . substr ( r ) , c = s . substr ( 0 , r ) , d = c . match ( /@([A-Za-z0-9\-\+\*_]*)$/ ) ; i = d && d [ 0 ] ? c . substr ( 0 , d . index ) + "@" + e : c + "@" + e , n ? ( p = i + "@" + e + " " + l , m = d . index + e . length + 2 ) : ( p = i + "@" + e + " (" + t + ") " + l , m = d . index + e . length + 2 , g = m + t . length ) , a . value = p , setFieldSelection ( a , m , g ) } this . hideSuggestions ( ) , this . onChange ( ) } , MessageComposer . prototype . onCommandSelected = function ( e , t ) { if ( t ) if ( this . richTextareaEl ) this . richTextareaEl . html ( encodeEntities ( e ) + " " ) , setRichFocus ( this . richTextareaEl [ 0 ] ) ; else { var n = this . textareaEl [ 0 ] ; n . value = e + " " , setFieldSelection ( n ) } else this . onCommandSend ( e ) ; this . hideSuggestions ( ) , this . onChange ( ) } , MessageComposer . prototype . onChange = function ( e ) { if ( this . richTextareaEl ) { delete this . keyupStarted ; var t = getRichValue ( this . richTextareaEl [ 0 ] ) ; this . textareaEl . val ( t ) . trigger ( "change" ) } this . updateInlinePlaceholder ( ) } , MessageComposer . prototype . getEmojiHtml = function ( e , t ) { t = t || EmojiHelper . emojis [ e ] ; var n = 20 , a = EmojiHelper . spritesheetPositions [ e ] , i = a [ 0 ] , o = ( a [ 1 ] , n * a [ 3 ] ) , s = n * a [ 2 ] ; return '<img src="img/blank.gif" alt=":' + encodeEntities ( t [ 1 ] ) + ':" data-code="' + encodeEntities ( e ) + '" class="emoji emoji-w20 emoji-spritesheet-' + i + '" style="background-position: -' + o + "px -" + s + 'px;" onresizestart="return false" />' } , MessageComposer . prototype . setValue = function ( e ) { this . richTextareaEl ? ( this . richTextareaEl . html ( this . getRichHtml ( e ) ) , this . lastLength = e . length , this . wasEmpty = ! e . length , this . onKeyEvent ( { type : "keyup" } ) ) : this . textareaEl . val ( e ) } , MessageComposer . prototype . setFocusedValue = function ( e ) { var t = e [ 0 ] , n = e [ 1 ] , a = e [ 2 ] ; if ( this . richTextareaEl ) { this . selId = ( this . selId || 0 ) + 1 ; var i = this . getRichHtml ( t ) + '<span id="composer_sel' + this . selId + '">' + this . getRichHtml ( n ) + "</span>" + this . getRichHtml ( a ) ; this . richTextareaEl . html ( i ) , setRichFocus ( this . richTextareaEl [ 0 ] , $ ( "#composer_sel" + this . selId ) [ 0 ] , ! 0 ) } else this . textareaEl . val ( t + n + a ) , setFieldSelection ( this . textareaEl [ 0 ] , t . length , t . length + n . length ) } , MessageComposer . prototype . getRichHtml = function ( e ) { var t = $ ( "<div>" ) . text ( e ) . html ( ) ; return t = t . replace ( /\n/g , "<br/>" ) , t = t . replace ( /:([A-Za-z0-9\-\+\*_]+?):/gi , function ( e , t ) { var n = EmojiHelper . shortcuts [ t ] ; return void 0 !== n ? this . getEmojiHtml ( n ) : e } . bind ( this ) ) , t = t . replace ( / /g , " " ) . replace ( /^ | $/g , " " ) } , MessageComposer . prototype . focus = function ( ) { this . richTextareaEl ? setZeroTimeout ( function ( ) { setRichFocus ( this . richTextareaEl [ 0 ] ) } . bind ( this ) ) : setFieldSelection ( this . textareaEl [ 0 ] ) } , MessageComposer . prototype . blur = function ( ) { this . richTextareaEl ? this . richTextareaEl [ 0 ] . blur ( ) : this . textareaEl [ 0 ] . blur ( ) } , MessageComposer . prototype . renderSuggestions = function ( ) { this . autoCompleteWrapEl . show ( ) , this . scroller . reinit ( ) , this . updatePosition ( ) , this . autocompleteShown = ! 0 } , MessageComposer . prototype . showEmojiSuggestions = function ( e ) { var t = this ; setZeroTimeout ( function ( ) { t . autoCompleteScope . $apply ( function ( ) { t . autoCompleteScope . type = "emoji" , t . autoCompleteScope . emojiCodes = e } ) , onContentLoaded ( function ( ) { t . ren
o . draftMessage . command = e } ) } } ) , B = L . richTextareaEl && L . richTextareaEl [ 0 ] ; B && $ ( B ) . on ( "keydown keyup" , y ) , o . $on ( "inline_results" , function ( e , t ) { var n = Config . Mobile ? $ ( window ) . width ( ) : ( P . offsetWidth || 382 ) - 2 , a = 80 ; t && u . regroupWrappedResults ( t . results , n , a ) , setZeroTimeout ( function ( ) { L . setInlineSuggestions ( t ) } ) } ) , o . $on ( "inline_placeholder" , function ( e , t ) { L . setInlinePlaceholder ( t . prefix , t . placeholder ) } ) , T . on ( "change" , function ( ) { var e = this ; o . $apply ( function ( ) { o . draftMessage . files = Array . prototype . slice . call ( e . files ) , o . draftMessage . isMedia = $ ( e ) . hasClass ( "im_media_attach_input" ) || Config . Mobile , setTimeout ( function ( ) { try { e . value = "" } catch ( t ) { } } , 1e3 ) } ) } ) ; var j = ! 0 ; o . $on ( "settings_changed" , h ) , h ( ) , $ ( F ) . on ( "mousedown touchstart" , f ) ; var H = B && B . offsetHeight ; $ ( document ) . on ( "keydown" , b ) , $ ( "body" ) . on ( "dragenter dragleave dragover drop" , S ) , $ ( document ) . on ( "paste" , C ) , m && ( o . $on ( "ui_peer_change" , w ) , o . $on ( "ui_history_focus" , w ) , o . $on ( "ui_history_change" , w ) ) , o . $on ( "ui_peer_change" , L . resetTyping . bind ( L ) ) , o . $on ( "ui_peer_draft" , function ( t , n ) { n = n || { } ; var a = o . draftMessage . isBroadcast ; L . setPlaceholder ( e ( a ? "im_broadcast_field_placeholder_raw" : "im_message_field_placeholder_raw" ) ) , n . customSelection ? ( L . setFocusedValue ( n . customSelection ) , y ( ) ) : ( B && ( L . setValue ( o . draftMessage . text || "" ) , y ( ) ) , ( m || n && n . focus ) && L . focus ( ) ) , onContentLoaded ( function ( ) { L . checkAutocomplete ( ! 0 ) } ) , O && Config . Mobile && O . hide ( ) } ) , o . $on ( "ui_peer_reply" , function ( ) { onContentLoaded ( function ( ) { o . $emit ( "ui_editor_resize" ) , m && L . focus ( ) } ) } ) , o . $on ( "mentions_update" , function ( ) { L . onMentionsUpdated ( ) } ) , o . $on ( "ui_message_before_send" , function ( ) { v ( ) } ) , o . $on ( "ui_message_send" , function ( ) { m && w ( ) } ) , o . $on ( "ui_message_blur" , function ( ) { L . blur ( ) } ) , o . $on ( "$destroy" , function ( ) { $ ( document ) . off ( "paste" , C ) , $ ( document ) . off ( "keydown" , b ) , $ ( "body" ) . off ( "dragenter dragleave dragover drop" , S ) , $ ( F ) . off ( "mousedown touchstart" ) , T . off ( "change" ) } ) , m && w ( ) } return { link : g , scope : { draftMessage : "=" , mentions : "=" , commands : "=" } } } ] ) . directive ( "myLoadThumb" , [ "MtpApiFileManager" , "FileManager" , function ( e , t ) { function n ( n , a , i ) { var o = 0 , s = e . getCachedFile ( n . thumb && n . thumb . location && ! n . thumb . location . empty && n . thumb . location ) ; s && a . attr ( "src" , t . getUrl ( s , "image/jpeg" ) ) , n . thumb && n . thumb . width && n . thumb . height && ( a . attr ( "width" , n . thumb . width ) , a . attr ( "height" , n . thumb . height ) ) ; var r = n . $watchCollection ( "thumb.location" , function ( i ) { n . thumb && n . thumb . width && n . thumb . height && ( a . attr ( "width" , n . thumb . width ) , a . attr ( "height" , n . thumb . height ) , n . $emit ( "ui_height" ) ) ; var s = ++ o ; if ( ! i || i . empty ) return a . attr ( "src" , n . thumb && n . thumb . placeholder || "img/blank.gif" ) , void l ( ) ; var r = e . getCachedFile ( i ) ; return r ? ( a . attr ( "src" , t . getUrl ( r , "image/jpeg" ) ) , void l ( ) ) : ( a . attr ( "src" ) || a . attr ( "src" , n . thumb . placeholder || "img/blank.gif" ) , void e . downloadSmallFile ( n . thumb . location ) . then ( function ( e ) { s == o && ( a . attr ( "src" , t . getUrl ( e , "image/jpeg" ) ) , l ( ) ) } , function ( e ) { console . log ( "Download image failed" , e , n . thumb . location , a [ 0 ] ) , s == o && ( a . attr ( "src" , n . thumb . placeholder || "img/blank.gif" ) , l ( ) ) } ) ) } ) , l = i . watch ? angular . noop : function ( ) { setTimeout ( function ( ) { n . $destroy ( ) , r ( ) } , 0 ) } } return { link : n , scope : { thumb : "=" } } } ] ) . directive ( "myLoadFullPhoto" , [ "MtpApiFileManager" , "FileManager" , "_" , function ( e , t , n ) { function a ( a , i , o ) { var s = $ ( "img" , i ) [ 0 ] , r = $ ( ".img_fullsize_with_progress_wrap" , i ) . add ( ".img_fullsize_progress_wrap" , i ) . add ( $ ( s ) ) , l = function ( ) { r . css ( { width : a . fullPhoto . width , height : a . fullPhoto . height } ) , a . $emit ( "ui_height" , ! 0 ) } , c = 0 ; a . $watchCollection ( "fullPhoto.location" , function ( ) { var i = e . getCachedFile ( a . thumbLocation ) , o = ++ c ; if ( i ? ( s . src = t . getUrl ( i , "image/jpeg" ) , l ( ) ) : s . src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" , a . fullPhoto . location ) { var r ; if ( a . fullPhoto . size ) { var d = { _ : "inputFileLocation" , volume _id : a . fullPhoto . location . volume _id , local _id : a . fullPhoto . location . local _id , secret : a . fullPhoto . location . secret } ; r = e . downloadFile ( a . fullPhoto . location . dc _id , d , a . fullPhoto . size ) } else r = e . downloadSmallFile ( a . fullPhoto . location ) ; a . progress = { enabled : ! 0 , percent : 0 } , r . then ( function ( e ) { o == c && ( a . progress . enabled = ! 1 , s . src = t . getUrl ( e , "image/jpeg" ) , l ( ) ) } , function ( e ) { console . log ( "Download image failed" , e , a . fullPhoto . locatio
t ( function ( ) { $ ( c ) . trigger ( "scroll" ) } ) } ) } ) , n . $on ( "ui_selection_clear" , function ( ) { window . getSelection ? window . getSelection ( ) . empty ? window . getSelection ( ) . empty ( ) : window . getSelection ( ) . removeAllRanges && window . getSelection ( ) . removeAllRanges ( ) : document . selection && document . selection . empty ( ) } ) , n . $on ( "ui_editor_resize" , s ) , n . $on ( "ui_height" , function ( ) { onContentLoaded ( s ) } ) ; var _ = ! 0 , v = - 1 ; $ ( c ) . on ( "scroll" , function ( e ) { if ( a . is ( ":visible" ) && ! $ ( c ) . hasClass ( "im_history_to_bottom" ) ) { var t = c . scrollTop ; _ = t >= c . scrollHeight - c . clientHeight , v >= 0 && v != t && ( v = - 1 ) , ! h && t <= 300 ? ( h = ! 0 , n . $emit ( "history_need_more" ) ) : ! f && t >= c . scrollHeight - c . clientHeight - 300 && ( f = ! 0 , n . $emit ( "history_need_less" ) ) } } ) , $ ( e ) . on ( "resize" , s ) , s ( ) , onContentLoaded ( s ) } return { link : i } } ] ) . directive ( "myContactsListMobile" , [ "$window" , "$timeout" , function ( e , t ) { function n ( t , n , a ) { function i ( ) { $ ( n ) . css ( { height : $ ( e ) . height ( ) - ( s && s . offsetHeight || 0 ) - ( o && o . offsetHeight || 0 ) - 64 } ) } var o = $ ( ".contacts_modal_search" ) [ 0 ] , s = $ ( ".contacts_modal_panel" ) [ 0 ] ; $ ( e ) . on ( "resize" , i ) , t . $on ( "contacts_change" , function ( ) { onContentLoaded ( i ) } ) , onContentLoaded ( i ) } return { link : n } } ] ) . directive ( "myCountriesListMobile" , [ "$window" , "$timeout" , function ( e , t ) { function n ( t , n , a ) { function i ( ) { $ ( n ) . css ( { height : $ ( e ) . height ( ) - ( s && s . offsetHeight || 0 ) - ( o && o . offsetHeight || 0 ) - 64 } ) } var o = $ ( ".countries_modal_search" ) [ 0 ] , s = $ ( ".countries_modal_panel" ) [ 0 ] ; $ ( e ) . on ( "resize" , i ) , onContentLoaded ( i ) } return { link : n } } ] ) . directive ( "myInfiniteScrollerMobile" , function ( ) { function e ( e , t , n ) { var a = t [ 0 ] , i = ! 1 ; $ ( a ) . on ( "scroll" , function ( n ) { t . is ( ":visible" ) && ! i && a . scrollTop >= a . scrollHeight - a . clientHeight - 300 && ( i = ! 0 , e . $apply ( function ( ) { e . slice . limit += e . slice . limitDelta || 20 } ) , onContentLoaded ( function ( ) { i = ! 1 } ) ) } ) } return { link : e , scope : ! 0 } } ) ;